5.1. Обработка массивов
Одномерные массивы
Данные задачи встречаются довольно часто. Если значения элементов массива
определяются довольно сложным выражением, а вычислять их надо многократно, то
векторизация или распараллеливание цикла для вычисления элементов массива может
оказаться очень эффективным. В отдельный параграф мы вынесли решение систем
дифференциальных уравнений, что по своей сути также является обработкой массивов
функций, производных и т.д. Но на самом деле эффективными могут также быть
вычисления сверток, сумм, функций от каждого элемента массива и т.п.
Конечно, не имеет смысл векторизовать или распараллеливать действия над короткими
массивами кроме тех случаев, когда собственно вычисления каждого элемента занимают
большое время.
5.1.2. Двумерные массивы
При исполнении вложенных циклов эффективно распараллеливаются самые внешние
циклы, а векторизуются только внутренние. Однако практически все действия с
матрицами (сложение, умножение, умножение на вектор, прямое произведение) могут
быть выполнены быстро на супер-ЭВМ. Многие алгоритмы линейной алгебры (но не все)
могут быть эффективно векторизованы и распараллелены. Некоторые библиотеки
подпрограмм (например, LAPACK(?)) существуют для параллельных и векторных машин.
Совершенно неэффективно использовать векторные ЭВМ для работы с матрицами
размерности 3x3. Но можно переписать алгоритм для одновременной обработки
нескольких (к примеру 1000) матриц - обращение, поиск собственных чисел и т.д.
При увеличении размера матриц растет эффективность работы программы, но растет и
размер требуемой памяти для хранения матриц. При работе на векторной машине с
небольшим (128-512 Мбайт) объемом ОЗУ это может стать причиной общего снижения ее
быстродействия из-за частого обращения к дискам при записи/чтении данных.
5.2. Вычисления в узлах сеток и решеток
Инженерные и научные задачи
Во многих областях знания встречаются задачи, которые сводятся к вычислению
эволюции объектов, расположенных в дискретных точках и взаимодействующих с
ближайшими соседями. Простейшей и, наверно, наиболее широко известной такой
задачей является игра "жизнь".
Все игровое поле представляет двумерную сетку с квадратными ячейками. Каждая ячейка
может быть в одном из двух состояний - пустая или живая. Если на каком-то шаге игры
вокруг пустого поля существуют ровно три живых поля, то на следующем шаге игры в
этом поле рождается жизнь. Если число живых полей вокруг пустого поля не равно трем,
то в это поле остается пустым. Если вокруг живого поля существуют два или три других
живых поля, то жизнь в в этом поле продолжается. Если число живых соседей отлично от
двух или трех, то поле погибает (становится пустым). Начальная конфигурация