Saya memiliki program MPI yang mengkompilasi dan menjalankan, tetapi saya ingin melangkah melaluinya untuk memastikan tidak ada yang aneh yang terjadi. Idealnya, saya ingin cara sederhana untuk melampirkan GDB ke proses tertentu, tapi saya tidak begitu yakin apakah itu mungkin atau bagaimana melakukannya. Sebuah alternatif akan meminta setiap proses menulis hasil debug ke file log yang terpisah, tetapi ini tidak benar-benar memberikan kebebasan yang sama dengan debugger.
Apakah ada pendekatan yang lebih baik? Bagaimana Anda men-debug program MPI?
Saya menemukan gdb cukup bermanfaat. Saya menggunakannya sebagai
Ini meluncurkan windows xterm yang bisa saya lakukan
biasanya berfungsi dengan baik
Anda juga dapat mengemas perintah-perintah ini bersama-sama menggunakan:
sumber
<file>
dan meneruskan-x <file>
ke gdb.Banyak posting di sini tentang GDB, tetapi tidak menyebutkan cara melampirkan proses dari startup. Jelas, Anda dapat melampirkan ke semua proses:
Tapi itu sangat tidak efektif karena Anda harus bangkit untuk memulai semua proses Anda. Jika Anda hanya ingin men-debug satu (atau sejumlah kecil) proses MPI, Anda dapat menambahkan itu sebagai executable terpisah pada baris perintah menggunakan
:
operator:Sekarang hanya satu dari proses Anda yang akan mendapatkan GDB.
sumber
Seperti yang disebutkan orang lain, jika Anda hanya bekerja dengan beberapa proses MPI, Anda dapat mencoba menggunakan beberapa sesi gdb , valgrind yang dapat dipertanyakan atau memutar solusi printf / logging Anda sendiri.
Jika Anda menggunakan lebih banyak proses dari itu, Anda benar-benar mulai membutuhkan debugger yang tepat. The openmpi FAQ merekomendasikan baik Allinea DDT dan TotalView .
Saya bekerja di Allinea DDT . Ini adalah debugger kode sumber grafis berfitur lengkap, jadi ya, Anda dapat:
...dan seterusnya. Jika Anda menggunakan Eclipse atau Visual Studio maka Anda akan betah.
Kami menambahkan beberapa fitur menarik khusus untuk debugging kode paralel (baik itu MPI, multi-threaded atau CUDA):
Variabel skalar secara otomatis dibandingkan di semua proses: (sumber: allinea.com )
Anda juga dapat melacak dan memfilter nilai-nilai variabel dan ekspresi selama proses dan waktu:
Ini banyak digunakan di antara 500 situs HPC teratas , seperti ORNL , NCSA , LLNL , Jülich et. Al.
Antarmukanya cukup tajam; kami menghitung waktu melangkah dan menggabungkan tumpukan dan variabel dari 220.000 proses pada 0,1 sebagai bagian dari pengujian penerimaan pada kelompok Jaguar Oak Ridge.
@tgamblin menyebutkan STAT yang luar biasa , yang terintegrasi dengan Allinea DDT , seperti halnya beberapa proyek open source populer lainnya.
sumber
http://valgrind.org/ kata nuf
Tautan lebih spesifik: Debugging MPI Program Paralel dengan Valgrind
sumber
Jika Anda seorang
tmux
pengguna, Anda akan merasa sangat nyaman menggunakan skrip Benedikt Morbach :tmpi
Sumber asli:
https://github.com/moben/scripts/blob/master/tmpiFork: https://github.com/Azrael3000/tmpi
Dengannya Anda memiliki beberapa panel (jumlah proses) yang semuanya disinkronkan (setiap perintah disalin pada semua panel atau proses pada saat yang sama sehingga Anda menghemat banyak waktu dibandingkan dengan
xterm -e
pendekatannya). Selain itu Anda dapat mengetahui nilai-nilai variabel dalam proses yang Anda inginkan hanya melakukanprint
tanpa harus pindah ke panel lain, ini akan mencetak pada setiap panel nilai-nilai variabel untuk setiap proses.Jika Anda bukan
tmux
pengguna, saya sangat merekomendasikan untuk mencobanya dan melihatnya.sumber
http://github.com/jimktrains/pgdb/tree/master adalah utilitas yang saya tulis untuk melakukan hal ini. Ada beberapa dokumen dan jangan ragu untuk bertanya kepada saya.
Anda pada dasarnya memanggil program perl yang membungkus GDB dan saluran itu IO ke server pusat. Ini memungkinkan GDB dijalankan pada setiap host dan bagi Anda untuk mengaksesnya pada setiap host di terminal.
sumber
Menggunakan
screen
bersama-samagdb
untuk men-debug aplikasi MPI berfungsi dengan baik, terutama jikaxterm
tidak tersedia atau Anda berurusan dengan lebih dari beberapa prosesor. Ada banyak jebakan di sepanjang jalan dengan menyertai pencarian stackoverflow, jadi saya akan mereproduksi solusi saya sepenuhnya.Pertama, tambahkan kode setelah MPI_Init untuk mencetak PID dan menghentikan program untuk menunggu Anda melampirkan. Solusi standar tampaknya merupakan infinite loop; Saya akhirnya memutuskan
raise(SIGSTOP);
, yang membutuhkan panggilan ekstracontinue
untuk melarikan diri dalam gdb.Setelah mengkompilasi, jalankan executable di latar belakang, dan tangkap stderr. Anda kemudian dapat
grep
file stderr untuk beberapa kata kunci (di sini PID harfiah) untuk mendapatkan PID dan peringkat dari setiap proses.Sesi gdb dapat dilampirkan ke setiap proses dengan
gdb $MDRUN_EXE $PID
. Melakukannya dalam sesi layar memungkinkan akses mudah ke sesi gdb.-d -m
memulai layar dalam mode terpisah,-S "P$RANK"
memungkinkan Anda memberi nama layar untuk akses mudah nanti, dan-l
opsi untuk mem-bash memulai dalam mode interaktif dan menjaga gdb agar tidak segera keluar.Setelah gdb dimulai di layar, Anda dapat memasukkan input ke layar (sehingga Anda tidak harus masuk ke setiap layar dan mengetik hal yang sama) menggunakan
-X stuff
perintah layar . Baris baru diperlukan di akhir perintah. Di sini layar diakses dengan-S "P$i"
menggunakan nama yang diberikan sebelumnya. The-p 0
pilihan adalah penting, jika perintah sebentar-sebentar gagal (berdasarkan pada apakah atau tidak Anda sebelumnya telah melekat pada layar).Pada titik ini Anda dapat melampirkan ke layar apa pun menggunakan
screen -rS "P$i"
dan melepaskan menggunakanCtrl+A+D
. Perintah dapat dikirim ke semua sesi gdb dalam analogi dengan bagian kode sebelumnya.sumber
Ada juga alat open-source saya, padb, yang bertujuan untuk membantu pemrograman paralel. Saya menyebutnya "Alat Inspeksi Pekerjaan" karena berfungsi tidak hanya sebagai debugger juga dapat berfungsi misalnya sebagai program seperti paralel atas. Jalankan dalam mode "Laporan Lengkap" itu akan menunjukkan Anda menumpuk jejak setiap proses dalam aplikasi Anda bersama dengan variabel lokal untuk setiap fungsi di setiap peringkat (dengan asumsi Anda dikompilasi dengan -g). Ini juga akan menunjukkan "antrian pesan MPI", yaitu daftar pengiriman dan penerimaan luar biasa untuk setiap peringkat dalam pekerjaan tersebut.
Selain menunjukkan laporan lengkap, Anda juga dapat memberi tahu padb untuk memperbesar setiap bit informasi dalam pekerjaan, ada banyak opsi dan item konfigurasi untuk mengontrol informasi apa yang ditampilkan, lihat halaman web untuk lebih jelasnya.
Padb
sumber
Cara "standar" untuk men-debug program MPI adalah dengan menggunakan debugger yang mendukung model eksekusi itu.
Di UNIX, TotalView dikatakan memiliki penunjang yang bagus untuk MPI.
sumber
Saya menggunakan metode homebrewn kecil ini untuk melampirkan debugger ke proses MPI - panggil fungsi berikut, DebugWait (), tepat setelah MPI_Init () dalam kode Anda. Sekarang saat proses sedang menunggu input keyboard, Anda memiliki semua waktu untuk melampirkan debugger ke sana dan menambahkan breakpoints. Setelah selesai, berikan input karakter tunggal dan Anda siap untuk pergi.
Tentu saja Anda ingin mengkompilasi fungsi ini hanya untuk debug build.
sumber
gethostname(hostname, sizeof(hostname)); printf("PID %d on host %s ready for attach\n", getpid(), hostname);
. Lalu, Anda lampirkan ke proses dengan mengetikrsh <hostname_from_print_statement>
, dan akhirnyagdb --pid=<PID_from_print_statement>
.Perintah untuk melampirkan gdb ke proses mpi tidak lengkap, seharusnya
Diskusi singkat tentang mpi dan gdb dapat ditemukan di sini
sumber
Cara yang cukup sederhana untuk men-debug program MPI.
Di main () fungsi tambah sleep (some_seconds)
Jalankan program seperti biasa
Program akan dimulai dan mulai tidur.
Jadi Anda akan memiliki beberapa detik untuk menemukan proses Anda oleh ps, jalankan gdb dan lampirkan padanya.
Jika Anda menggunakan beberapa editor seperti QtCreator, Anda dapat menggunakannya
Debug-> Mulai debugging-> Lampirkan untuk menjalankan aplikasi
dan menemukan Anda proses di sana.
sumber
Saya melakukan beberapa debug terkait MPI dengan jejak log, tetapi Anda juga dapat menjalankan gdb jika Anda menggunakan mpich2: MPICH2 dan gdb . Teknik ini adalah praktik yang baik secara umum ketika Anda berurusan dengan proses yang sulit untuk memulai dari debugger.
sumber
mpirun -gdb
Terima kasih kepada http://www.ncsa.illinois.edu/UserInfo/Resources/Hardware/CommonDoc/mpich2_gdb.html ( tautan arsip )
sumber
Solusi lain adalah menjalankan kode Anda dalam SMPI, MPI yang disimulasikan. Itu proyek sumber terbuka di mana saya terlibat. Setiap peringkat MPI akan dikonversi menjadi utas dari proses UNIX yang sama. Anda kemudian dapat dengan mudah menggunakan gdb untuk melangkah ke peringkat MPI.
SMPI mengusulkan keuntungan lain untuk mempelajari aplikasi MPI: clairevoyance (Anda dapat mengamati setiap bagian dari sistem), reproduktifitas (beberapa run mengarah ke perilaku yang sama persis kecuali Anda tentukan demikian), tidak adanya heisenbug (karena platform yang disimulasikan tetap berbeda dari host satu), dll.
Untuk informasi lebih lanjut, lihat presentasi ini , atau jawaban terkait itu .
sumber