Rumah > Artikel > pembangunan bahagian belakang > Teknik pengaturcaraan selari MPI dalam pengoptimuman prestasi fungsi C++
Apabila menggunakan pengaturcaraan selari MPI dalam pengoptimuman prestasi fungsi C++, segmen kod yang tidak bergantung pada bahagian lain boleh diselaraskan. Langkah-langkah khusus termasuk: mencipta proses tambahan MPI dan mendapatkan pengecam; Dengan menyelaraskan fungsi seperti pendaraban matriks, MPI boleh meningkatkan prestasi pemprosesan data berskala besar dengan ketara.
Petua Pengaturcaraan Selari MPI dalam Pengoptimuman Prestasi Fungsi C++
Pengenalan
Dalam kod C++, mengoptimumkan prestasi fungsi adalah penting, terutamanya apabila aplikasi perlu memproses sejumlah besar data. MPI (Antara Muka Mesej Mesej) ialah perpustakaan pengaturcaraan selari yang berkuasa yang boleh digunakan untuk mengedarkan pengiraan pada mesin berbilang teras, kelompok atau sistem teragih. Tutorial ini meneroka teknik praktikal dan kes praktikal untuk menggunakan MPI untuk mengoptimumkan prestasi fungsi C++.
Asas MPI
MPI ialah standard industri untuk menulis program selari. Ia menyediakan mekanisme penghantaran mesej yang membolehkan proses bertukar data dan menyegerakkan operasi. Aplikasi MPI biasanya mengikut model tuan-hamba, di mana proses induk mencipta satu set proses pekerja dan mengagihkan tugas.
Fungsi Penyelarasan
Untuk menyelaraskan fungsi C++, kita perlu:
MPI_Init()
dan MPI_Comm_rank()
untuk mencipta proses pekerja dan mendapatkan pengecam uniknya. MPI_Init()
和 MPI_Comm_rank()
创建辅助进程并获取它们的唯一标识符。MPI_Scatter()
将数据拆分为更小的块并分配给各个进程。MPI_Gather()
将结果集合到主进程。实战案例:并行化矩阵乘法
考虑如下 3x3 矩阵乘法:
void matrix_multiplication(int n, float A[3][3], float B[3][3], float C[3][3]) { for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { for (int k = 0; k < n; k++) { C[i][j] += A[i][k] * B[k][j]; } } } }
我们可以使用 MPI 将此函数并行化如下:
void parallel_matrix_multiplication(int n, float A[3][3], float B[3][3], float C[3][3]) { int rank, num_procs; MPI_Init(NULL, NULL); MPI_Comm_rank(MPI_COMM_WORLD, &rank); MPI_Comm_size(MPI_COMM_WORLD, &num_procs); int rows_per_proc = n / num_procs; float sub_A[rows_per_proc][3], sub_B[rows_per_proc][3]; MPI_Scatter(A, rows_per_proc * 3, MPI_FLOAT, sub_A, rows_per_proc * 3, MPI_FLOAT, 0, MPI_COMM_WORLD); MPI_Scatter(B, rows_per_proc * 3, MPI_FLOAT, sub_B, rows_per_proc * 3, MPI_FLOAT, 0, MPI_COMM_WORLD); for (int i = 0; i < rows_per_proc; i++) { for (int j = 0; j < n; j++) { for (int k = 0; k < n; k++) { C[i][j] += sub_A[i][k] * sub_B[k][j]; } } } MPI_Gather(C, rows_per_proc * 3, MPI_FLOAT, C, rows_per_proc * 3, MPI_FLOAT, 0, MPI_COMM_WORLD); MPI_Finalize(); }
在这个示例中:
A
和 B
分散到辅助进程。MPI_Gather()
收集到主进程。MPI_Finalize()
Gunakan MPI_Scatter()
untuk membahagikan data kepada bahagian yang lebih kecil dan mengedarkannya kepada proses individu.
MPI_Gather()
untuk mengumpulkan hasil ke dalam proses utama. . buat proses MPI dan dapatkan pengecam proses. 🎜🎜Pisah matriks input B
kepada proses pekerja. 🎜🎜Setiap proses mengira bahagian pendaraban matriks yang ditetapkan. 🎜🎜Hasil dikumpulkan ke dalam proses utama menggunakan MPI_Gather()
. 🎜🎜Selepas semua proses selesai pengiraan, MPI_Finalize()
akan menutup persekitaran MPI. 🎜🎜🎜Dengan menyelaraskan fungsi pendaraban matriks ini, kami boleh meningkatkan prestasi pendaraban matriks besar dengan ketara. 🎜Atas ialah kandungan terperinci Teknik pengaturcaraan selari MPI dalam pengoptimuman prestasi fungsi C++. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!