Intereting Posts
Как печатать несколько файлов одновременно с помощью lpr? Как перечислять все процессы linux, которые имели какую-либо сетевую активность в течение определенного периода времени (прошлое или будущее)? Vmware Xorg ошибка компиляции раскладки? Подключение ssh к gitlab.com не подходит для домашнего маршрутизатора, но отлично работает на рабочем месте. Тем не менее, Гитуб и Битбакет над ssh прекрасно работают дома Fail2ban для nginx post flood игнорирует временные интервалы Не удалось выполнить скомпилированную программу C etckeeper для opensuse – установка скрипта bash и настройка Как изменить пароль пользователя LDAP? Как подключиться к SSH через промежуточный сервер? Как принудительно проверить файловую систему при следующей загрузке корневой файловой системы в системе gentoo? iscsi Диск не отображается в / dev / disk / by-path Зашифруйте мой диск, но разрешите вводить пароль с SSH Это нормально для пакета, чтобы поместить файл в sudoers.d? «Dd» Utillity Скопировано больше, чем ожидалось Каталоги перечислены дважды

Использование 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. Кроме того, программа просто останавливается. Почему это?

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

 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-указателя.) Я не думаю, что есть другой / лучший способ.