Использование MPI с .sh скриптом?

Я новичок в Unix и MPI. У меня скрипт runPR.sh как runPR.sh ниже

 DIR=/directory/buildagain/bin/Project FILELIST=$1 while read FILE do echo "Processing ${FILE}..." ./makeInp.sh ${FILE} ${FILE} >INP/${FILE}.inp ${DIR} -PR INP/${FILE}.inp done < ${FILELIST} 

Для последовательной программы я запускаю программу, набрав make в /directory/buildagain а затем ./runPR.sh values.txt . ( values.txt просто содержит Chain строк)

EDIT: Вот небольшая часть моего кода.

  int main( int argc, char *argv[ ] ) { MPI_Status status; MPI_Init(&argc,&argv); if( strcmp(argv[1],"-PR") == 0 ) runPR(argc-2, &argv[2]); return 0; } int runPR(int argc, char* argv[]) { cout<<"run here"<<endl; int mynode, totalnodes; int sum,startval,endval,accum; int master=0; MPI_Comm_size(MPI_COMM_WORLD, &totalnodes); // get totalnodes MPI_Comm_rank(MPI_COMM_WORLD, &mynode); // get mynode PROpt opt; Solve* ps = new Solve(); cout<<"here1"<<endl; cout<<"total nodes "<<totalnodes<<endl; for(int j=0;j<totalnodes-1;j=j+1){ cout<<"processor"<<mynode<<" received from "<<j<<endl; ps->getFile(&opt,argv[0]); } } 

Набрав mpirun -np 4 ../directory/buildagain/bin/Project -PR INP/Chain.inp , я вижу run here , here total nodes1 напечатано 4 раза. Но я не вижу cout<<"processor"<<mynode<<" received from "<<j<<endl; напечатано, и я ожидал, что total nodes будут показывать 4, а не 1. Кроме того, программа просто останавливается. Почему это?

One Solution collect form web for “Использование MPI с .sh скриптом?”

После того, как вы сообщили о получении

 total nodes=1 

а также

 This node=0 

распечатано 4 раза, я пришел к выводу, что вы пытаетесь это сделать: mpirun -np 4 script-name.sh . Он делает это, потому что mpirun запускает 4 копии сценария оболочки, который не понимает семантику обмена MPI.

Если вы можете каким-то образом запустить mpirun в скрипте, тогда запомните (1), что сценарий запущен в локальной «головной» среде узла, а не удаленном, (2) сценарий должен exec в вашей программе в качестве последнего и последнего вздоха , и (3), когда программа запускается, она находится в среде, возможно, на другом узле – возможно, не имеет доступа к файлам, которые у вас были на голове.

Поэтому сценарий должен выглядеть так:

 PROG="$1"; shift; OPT="$2"; shift for FILE in "$@" do echo "Processing ${FILE}..." ./makeInp.sh ${FILE} ${FILE} >INP/${FILE}.inp done exec $PROG $OPT "$@" 

В PROG вам нужно будет индексировать ARGV для соответствия текущему узлу / потоку. (Убедитесь, что вы не превысили argc или вы получите нарушение NULL-указателя.) Я не думаю, что есть другой / лучший способ.

  • Запустите сценарий оболочки перед запуском
  • как обращаться с аргументами при выполнении скрипта
  • xterm не использует .Xresources
  • Как удалить дубликаты файлов с помощью bash
  • Как я могу выполнить некоторые команды в сценарии оболочки с `sudo`, а другие нет?
  • Копирование файла на несколько других файлов с разными именами
  • Использовать встроенный встроенный bash без цикла while
  • Извлечение чисел с десятичной точкой из вывода ls в Bash
  • Как перемещать или копировать список файлов, на которые ссылается файл csv, в новую папку
  • Как использовать sudo -i в сценарии оболочки
  • Как печатать только определенные символы?
  • Linux и Unix - лучшая ОС в мире.