Mengapa pemecah paralel saya lebih lambat dari pemecah berurutan saya?

14

Saya bermain-main dengan PETSc dan memperhatikan bahwa ketika saya menjalankan program saya dengan lebih dari satu proses melalui MPI tampaknya berjalan lebih lambat ! Bagaimana saya dapat memeriksa untuk melihat apa yang sedang terjadi?

Sean Farley
sumber
Tidak memposting ini sebagai jawaban karena itu benar-benar "apa" daripada "bagaimana", tetapi saya memiliki masalah yang sama di masa lalu yang disebabkan oleh bagian kode yang dilindungi mutex yang diakses dari berbagai utas. Terkadang Anda harus memeriksa untuk mengunci sumber daya bersama di balik layar.
David Z

Jawaban:

13

Ini dapat timbul dari faktor arsitektur :

Jika bandwidth memori yang sama tersedia untuk satu atau lebih proses, maka Anda akan melihat hampir tidak ada peningkatan karena SpMV dan operasi aljabar linier terkait adalah bandwidth memori terbatas.

Mungkin juga bahwa overhead komunikasi membanjiri perhitungan lokal Anda. Misalnya, dalam metode iteratif linier, kami sarankan memiliki setidaknya 10.000 tidak diketahui per proses.

atau faktor numerik :

Prekondisi paralel seringkali lebih lemah daripada rekan-rekan serial mereka. Misalnya, blok Jacobi semakin lemah semakin banyak blok yang Anda gunakan. Dengan demikian, Anda perlu memperhitungkan waktu ekstra yang dihabiskan untuk iterasi linier ekstra. Kondisi nonlinier secara umum tidak bekerja dengan cara ini, sehingga iterasi Newton seringkali konstan.

Matt Knepley
sumber
8

Setiap kali mencoba memparalelkan suatu program Anda harus menyeimbangkan sejumlah biaya, tetapi terutama ada

  • Biaya menjalankan setiap perhitungan
  • Biaya komunikasi apa pun di antara perhitungan tersebut
  • Biaya mengelola perhitungan tersebut

Jika perhitungan Anda paralel secara memalukan maka biaya komunikasi akan sangat rendah (input dan output saja) dan biaya manajemen harus sangat rendah.

Jika Anda memiliki saling ketergantungan antar komputasi, biaya komunikasi dapat naik secara signifikan. Jika Anda memiliki algoritme kompleks yang membutuhkan waktu berbeda untuk menyelesaikan perhitungan apa pun, maka kompleksitas manajemen naik, saat Anda mencoba untuk secara efisien memanfaatkan sumber daya yang Anda miliki.

Seperti halnya segala bentuk optimasi, kuncinya adalah to benchmark. Lihatlah bagaimana kinerjanya tanpa MPI, bagaimana kinerjanya dengan MPI dan satu proses, kemudian lihat bagaimana skala.

Jika Anda bermain dengan CUDA, coba berikan lebih banyak data. Satu tes di sini menghasilkan percepatan negatif. Kami memberikannya 1000 kali lebih banyak data dan versi GP-GPU selesai dalam waktu yang hampir bersamaan, sementara versi yang berjalan pada CPU utama memakan waktu 1000 kali lebih lama.

Mark Booth
sumber
3

Saya akan merekomendasikan Anda melakukan hal berikut:

  • Buat profil waktu eksekusi kode Anda, dengan dan tanpa paralelisasi. Jika Anda ragu tentang cara melakukan ini, kami dapat membantu Anda jika Anda menjabarkan kode Anda dengan lebih baik.

  • Anda sekarang dapat fokus pada bagian-bagian yang berjalan lebih lambat secara paralel. Anda harus menyadari bahwa komunikasi antar proses mungkin lambat. Seperti Mark dan Sean tunjukkan, hanya karena masalah dapat dibagi menjadi utas bukan berarti melakukan itu akan efisien. Anda harus melihatnya lebih dalam. Tetapi jika Anda membuat profil kode Anda, ini dapat membantu Anda menemukan bug yang ada. Dua sen saya.

Jika Anda menjelaskan apa yang Anda lakukan secara lebih rinci, misalnya dengan alur kerja, seseorang mungkin dapat memberi Anda penjelasan yang lebih baik.

jbcolmenares
sumber
@ketch: Anda benar. Maaf dan terima kasih sudah memperhatikan. Teks yang diedit.
jbcolmenares