Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Teknik pengaturcaraan selari MPI dalam pengoptimuman prestasi fungsi C++

Teknik pengaturcaraan selari MPI dalam pengoptimuman prestasi fungsi C++

WBOY
WBOYasal
2024-04-23 12:51:011197semak imbas

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.

C++ 函数性能优化中的 MPI 并行编程技巧

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:

  1. Mengenal pasti bahagian kod yang boleh disejajarkan: Mengenal pasti bahagian kod yang lain secara serentak tanpa dilaksanakan semula secara serentak
  2. Buat proses MPI: Gunakan MPI_Init() dan MPI_Comm_rank() untuk mencipta proses pekerja dan mendapatkan pengecam uniknya. MPI_Init()MPI_Comm_rank() 创建辅助进程并获取它们的唯一标识符。
  3. 分配任务:使用 MPI_Scatter() 将数据拆分为更小的块并分配给各个进程。
  4. 执行并行任务:每个进程独立执行其分配的任务。
  5. 收集结果:使用 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();
}

在这个示例中:

  • 我们创建 MPI 进程并获取进程标识符。
  • 将输入矩阵 AB 分散到辅助进程。
  • 每个进程计算其分配的那部分矩阵乘法。
  • 结果使用 MPI_Gather() 收集到主进程。
  • 在所有进程完成计算后,MPI_Finalize()
Tugas pengagihan:

Gunakan MPI_Scatter() untuk membahagikan data kepada bahagian yang lebih kecil dan mengedarkannya kepada proses individu.

🎜🎜Laksanakan tugasan selari: 🎜Setiap proses melaksanakan tugas yang diberikan secara bebas. 🎜🎜🎜Kumpul hasil: 🎜Gunakan MPI_Gather() untuk mengumpulkan hasil ke dalam proses utama. . buat proses MPI dan dapatkan pengecam proses. 🎜🎜Pisah matriks input A dan 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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn