208
Чтобы узнать, найден ли ключ, удобно использовать кол-
лективную функцию
MPI_Allgather, которая позволяет каждому про-
цессу иметь информацию обо всех процессах.
MPI_Allgather( &num, 1, MPI_INT, buf, 1, MPI_INT, MPI_COMM_WORLD).
В результате вызова этой функции в массиве buf будут находиться
значения переменной
num всех процессов коммуникатора, которая
будет иметь значение
0xff, если ключ найден, и нуль – в противном
случае.
Если ключ найден, необходимо остановить работу всех процессов.
Имеется два варианта остановки процессов. Если при проверке каж-
дого варианта ключа опрашивать процессы о необходимости продол-
жать работу, то получится, что все процессы синхронизируют свои
действия и постоянно опрашивают друг друга, что, естественно, нера-
ционально. Если опрашивать процессы не на каждой итерации цикла
перебора, а, например, при каждом новом значении старшей части
ключа (после полного перебора всех значений младшей части), то это
приведет к дополнительному счету по поиску ключа, когда он уже
найден, но процессы не знают об этом. Анализ показывает, что реа-
лизация второго способа позволяет получить хороший параллельный
алгоритм для решения задачи.
Возможны следующие случаи нахождения ключа процессами при
полном переборе вариантов:
• ключ найден одним из процессов,
• ключ из заданного диапазона не найден ни одним процессом,
• часть процессов закончила перебор значений ключа, а другая –
продолжает перебор значений.
В первом случае коллективный опрос процессов приведет к пре-
кращению работы всех процессов приложения в случае нахождения
ключа. Это можно реализовать вызовом функции
MPI_Allgather и
анализом полученных данных. Программа представлена ниже.
MPI_Allgather( &num,1,MPI_INT,buf,1,MPI_INT,MPI_COMM_WORLD);
for (i=0; i<numprocs; i++)
if (buf[i]==0xFF)
{ /* значение num=0xFF, если ключ найден */
printf("process %d stopped \n",myid);
MPI_Finalize(); /* прерывание работы процессов */
return 0;
}