Методы выполнения векторных операций |
16-03-2022 |

Ниже мы расскажем, в чем особенность операций над векторными переменными и как эти операции выполняются в компьютерах различных классов. В компьютере общего назначения обработка векторов или массивов чисел в формате с плавающей запятой организуется в виде циклической процедуры, причем в каждом цикле обрабатывается очередной элемент массива. Рассмотрим, например, два вектора (одномерных числовых массива) - А и В. Необходимо добавить их и поместить результат в вектор С. Для этого потребуется шесть операций сложения:
Как ускорить выполнение подобных операций? Необходимо внедрить параллелизм в той или иной форме.
Существует несколько подходов к внедрению идей параллельного выполнения операций в обработку векторов. Проще рассмотреть их на конкретном примере перемножения квадратных матриц размером. Формула для вычисления каждого элемента матрицы результата имеет вид:
Здесь, и - элементы матриц А, В и С.
Ниже представлен текст программы на языке FORTRAN, которую можно выполнять на любом скалярном процессоре общего назначения.
DO 100 I = 1, N DO 100 J = 1, NC (I, J) = 0.0 DO 100 К = 1, N
C (I, J) = C (I, J) + A (I, K) * B (K, J) 100 CONTINUE
Один из методов повышения производительности выполнения подобных вычислений получил название векторной обработки. Этот метод предполагает, что в программе можно оперировать с одномерным вектором данных. Ниже представлена программа модифицированной языке FORTRAN, в котором реализована новая форма операторов, что позволяет специфицировать операции над векторами.
DO 100 I = 1, N C (I, J) = 0.0 (J = 1, N) DO 100 К = 1, N
C (I, J) = C (I, J) + A (I, K) * B (K, J) (J = 1, N) 100 CONTINUE
Член вида (J = 1, N) означает, что операции над элементами со всеми индексами J в заданном интервале будут выполняться как единая процедура. О способе реализации такого метода вычислений будет рассказано ниже. В представленном тексте программы все элементы в i-й строке исчисляются параллельно. Каждый элемент в строке представляет собой сумму, слагаемые которого исчисляются последовательно. Но даже в этом случае нужно только операций векторного умножения по сравнению с операций скалярного умножения в предыдущем варианте.
Следующий вариант - параллельная обработка. Такой подход предполагает, что в нашем распоряжении находится N независимых процессоров, работающих параллельно. Для того чтобы эффективно их использовать, нужно каким-то образом указать, какие вычисления должны выполнять эти процессоры. Для этого в языке программирования существует два типа директив. Директива FORK n указывает, что параллельно выполняемые процессы начинаются в строке программы с меткой n. Но исходный процесс продолжается оператором, стоящей сразу за FORK. Каждое исполнение директивы FORK порождает новый процесс. Директива JOIN выполняет роль обратной FORK. Выражение JOIN N указывает, что N независимых процессов сливаются в один, который продолжается оператором, стоящей сразу за JOIN. Координация такого слияния процессов возлагается на операционную систему, и выполнения общего процесса не возобновляется до тех пор, пока все параллельные независимые процессы не завершатся.





Автор: Andres | 25-03-2015, 13:47 |
Проверенная старенькая nero 7, не подводит уже лет 10 |