коммунистические вычисления ALEK SILVERSTONE Спецвыпуск: Хакер, номер #065, стр. 065-070-6 В MPICH'е есть много примеров на C++, так что посмотрим что-нибудь на Delphi. Чтобы сделать полноценный пример, я взял свою старую программу для взлома RAR-архива (см. ][ #02/2005) и переписал ее под MPI. Сразу расскажу, как запускать эту программу. Копируем полученный после компиляции exe'шник, passlist.txt и unrar.dll в папку, расшариваем ее. Допустим, сетевой путь этой папки \\Notebook\Run. Запускаем MPIrun, заходим в настройки и в строке Drive mappings вводим m:\\notebook\run, где m — буква диска, не существующего в ОС. Затем в строке ввода пути к приложению пишем m:\RARcrack.exe brute_me.rar. Самый сложный кусок кода главной ветки ты видишь на врезке. В первом цикле нулевая ветвь рассылает остальным первое задание — слова для перебора. Сначала идет размер буфера, потом посылается и сам буфер. Во втором цикле сначала наполняется новый буфер слов. Если слова закончились, то программа выходит из этого цикла. Затем идет получение пакета от другой ветви и сравнение его идентификатора с идентификатором, зарезервированным за пакетом, рапортующим о нахождении пароля. Если определено, что найден как раз нужный пакет, опять же, выходим из цикла. В противном случае отсылаем следующую порцию паролей. Третий цикл ждет любые пакеты от всех ветвей по очереди и посылает им ноль слов: либо файл закончился, либо пароль уже найден. Остальной код с подробными комментариями лежат на диске к журналу. вот и конец статьи. Конечно же, очень многое осталось за бортом. Например, еще в 1997 году появился стандарт MPI-2, и сравнительно недавно была выпущена его первая реализация. Изменения довольно значительные: динамическое создание и удаление потоков, нормальный обмен сообщениями через разделяемую память, архитектурно-независимый доступ к файлам, клиент-серверные возможности. Все это позволяет писать не только расчетные задачи, но и системы массового обслуживания — базы данных и т.д. Почему же мы рассматривали MPI-1? Главное объяснение в том, что первый стандарт состоит из 300 страниц, в MPI-2 добавлено 500, причем в это число входят только исправления и дополнения к первому. Изложить все на нескольких журнальных полосах невозможно. Хочу сказать «большое спасибо» Debugger'у за ноутбук, локальную сеть и кофе, предоставленные на заключительном этапе написания статьи :) Передача разнородных данных // переменные type TOurStruct=record i:integer; d:double; st:array[0..9] of char; end; var p:pointer; OurStruct:TOurStruct; buf_pos,buf_size:integer; Stat:MPI_Status; // первая ветвь OurStruct.i:=777; OurStruct.d:=5.0; OurStruct.st:='0123456789'; buf_size:=0; MPI_Pack_size(1,MPI_INT,MPI_COMM_WORLD,@buf_size); MPI_Pack_size(1,MPI_DOUBLE,MPI_COMM_WORLD,@buf_size); MPI_Pack_size(10,MPI_CHAR,MPI_COMM_WORLD,@buf_size); GetMem(p,buf_size); pos:=0; MPI_Pack(@buf.i,1,MPI_INT,p,buf_size,@pos,MPI_COMM_WORLD); MPI_Pack(@buf.d,1,MPI_DOUBLE,p,buf_size,@pos,MPI_COMM_WORLD); |