25
допускает параллельную обработку данных, хотя сами они должны
выполняться в строго определенной последовательности, логично
реализовать их в виде двух самостоятельных приложений. Функция
Initialize, входящая в состав первой программы, будет отвечать за
распределение исходных данных, необходимых для счета интегралов.
Это распределение должно быть осуществлено таким образом, чтобы
число сформированных подзадач примерно на
порядок превосходило
число доступных вычислительных узлов. Такое разбиение позволит
более рационально использовать доступные аппаратные ресурсы. Если
параметры вычислительной среды заранее определены и известно, что
ее конфигурация не претерпит значительных изменений на
протяжении всего эксперимента, то желательно иметь возможность
явно указывать необходимый масштаб подзадач или их количество.
Для этого можно использовать
файл настроек, содержимое которого
будет анализироваться функцией Initialize (такой же подход вполне
приемлем и для второй программы). Функция Calculate первой
программы будет выполнять непосредственное вычисление
интегралов. Сбор значений, полученных в результате вызовов
Calculate на различных узлах системы, будет произведен
автоматически средствами СРВ MathNet. Вычисленные значения
интегралов поступят в буфер, подаваемый на вход функции Initialize,
которая
сформирует из них искомую матрицу и сохранит ее на
рабочей станции, отвечающей за выполнение серверного процесса.
Основной задачей второй программы, как отмечалось выше, будет
решение СЛАУ (представленной в матричной форме) одним из
итерационных методов (например, методом сопряженных градиентов).
Функция Initialize этой программы выполнит разрезание полученной
на предыдущем этапе матрицы по строкам и
поместит образовавшиеся
массивы значений во входные буферы подзадач вместе с копиями
вектора-множителя. Собственно итерационный процесс по методу
сопряженных градиентов будет реализован функцией Calculate.
Ключевой операцией, выполняемой этой функцией, будет умножение
подмножества строк матрицы на вектор. Представление результатов в
нужной форме и их сохранение для последующего анализа и
дальнейшего использования, как
и в предыдущем случае, выполнит
функция Initialize. Процесс решения задачи дифракции для тела
заданной формы можно будет считать законченным после успешного
завершения работы второй программы.