ডিবাগ করতে এমপিআই অ্যাপ্লিকেশনগুলির screen
সাথে একসাথে ব্যবহার gdb
করা দুর্দান্তভাবে কাজ করে, বিশেষত যদি xterm
অনুপলব্ধ থাকে বা আপনি কয়েকটি প্রসেসরের বেশি ব্যবহার করছেন। স্ট্যাকওভারফ্লো অনুসন্ধানগুলি সহ পথটিতে অনেকগুলি সমস্যা ছিল, তাই আমি আমার সমাধানটি পুরোপুরি পুনরুত্পাদন করব।
প্রথমে পিআইডি প্রিন্ট আউট করতে MPI_Init এর পরে কোড যুক্ত করুন এবং আপনার সংযুক্তির জন্য অপেক্ষা করার জন্য প্রোগ্রামটি বন্ধ করুন। মানক সমাধানটি অসীম লুপ বলে মনে হয়; আমি অবশেষে স্থির হয়ে গেলাম raise(SIGSTOP);
, যার জন্য continue
জিডিবির মধ্যে পালাতে অতিরিক্ত কল দরকার ।
}
int i, id, nid;
MPI_Comm_rank(MPI_COMM_WORLD,&id);
MPI_Comm_size(MPI_COMM_WORLD,&nid);
for (i=0; i<nid; i++) {
MPI_Barrier(MPI_COMM_WORLD);
if (i==id) {
fprintf(stderr,"PID %d rank %d\n",getpid(),id);
}
MPI_Barrier(MPI_COMM_WORLD);
}
raise(SIGSTOP);
}
সংকলনের পরে, পটভূমিতে এক্সিকিউটেবল চালান, এবং স্টডারকে ধরুন। তারপরে grep
প্রতিটি প্রক্রিয়াটির পিআইডি এবং র্যাঙ্ক পেতে আপনি কিছু কীওয়ার্ডের (এখানে আক্ষরিক পিআইডি) স্ট্যাডার ফাইল করতে পারেন ।
MDRUN_EXE=../../Your/Path/To/bin/executable
MDRUN_ARG="-a arg1 -f file1 -e etc"
mpiexec -n 1 $MDRUN_EXE $MDRUN_ARG >> output 2>> error &
sleep 2
PIDFILE=pid.dat
grep PID error > $PIDFILE
PIDs=(`awk '{print $2}' $PIDFILE`)
RANKs=(`awk '{print $4}' $PIDFILE`)
একটি জিডিবি অধিবেশন প্রতিটি প্রসেসের সাথে সংযুক্ত করা যেতে পারে gdb $MDRUN_EXE $PID
। স্ক্রিন সেশনের মধ্যে এটি করা যে কোনও জিডিবি সেশনে সহজেই অ্যাক্সেসের অনুমতি দেয়। -d -m
স্ক্রিনটি বিচ্ছিন্ন মোডে শুরু করে, -S "P$RANK"
পরে সহজে অ্যাক্সেসের জন্য আপনাকে পর্দার নামকরণ করতে দেয় এবং -l
বশ করার বিকল্পটি এটি ইন্টারেক্টিভ মোডে শুরু করে এবং জিডিবি'কে তত্ক্ষণাত প্রস্থান করা থেকে বিরত রাখে।
for i in `awk 'BEGIN {for (i=0;i<'${#PIDs[@]}';i++) {print i}}'`
do
PID=${PIDs[$i]}
RANK=${RANKs[$i]}
screen -d -m -S "P$RANK" bash -l -c "gdb $MDRUN_EXE $PID"
done
একবার জিডিবি স্ক্রিনে শুরু হয়ে গেলে, আপনি স্ক্রিনের -X stuff
কমান্ডটি ব্যবহার করে স্ক্রিনগুলিতে ইনপুট স্ক্রিপ্ট করতে পারেন (যাতে আপনাকে প্রতিটি স্ক্রিনে প্রবেশ করতে হবে না এবং একই জিনিসটি টাইপ করতে হবে না) । কমান্ডের শেষে একটি নতুন লাইন প্রয়োজন। এখানে -S "P$i"
প্রদত্ত নামগুলি ব্যবহার করে স্ক্রিনগুলি অ্যাক্সেস করা যায় । -p 0
বিকল্প সমালোচনামূলক, অন্যথায় কমান্ড থেমে থেমে ব্যর্থ (থাকুক বা না থাকুক আপনি পূর্বে পর্দায় সংযুক্ত করেছি উপর ভিত্তি করে) হয়।
for i in `awk 'BEGIN {for (i=0;i<'${#PIDs[@]}';i++) {print i}}'`
do
screen -S "P$i" -p 0 -X stuff "set logging file debug.$i.log
"
screen -S "P$i" -p 0 -X stuff "set logging overwrite on
"
screen -S "P$i" -p 0 -X stuff "set logging on
"
screen -S "P$i" -p 0 -X stuff "source debug.init
"
done
এই মুহুর্তে আপনি যে কোনও স্ক্রিনের সাথে সংযুক্ত করে ব্যবহার করে screen -rS "P$i"
আলাদা করতে পারেন Ctrl+A+D
। কমান্ডগুলি আগের কোডের বিভাগের সাথে সাদৃশ্যতে সমস্ত জিডিবি সেশনে প্রেরণ করা যেতে পারে।