Методы выполнения векторных операций |
25-10-2023 |
Ниже мы расскажем, в чем особенность операций над векторными переменными и как эти операции выполняются в компьютерах различных классов. В компьютере общего назначения обработка векторов или массивов чисел в формате с плавающей запятой организуется в виде циклической процедуры, причем в каждом цикле обрабатывается очередной элемент массива. Рассмотрим, например, два вектора (одномерных числовых массива) - А и В. Необходимо добавить их и поместить результат в вектор С. Для этого потребуется шесть операций сложения:
Как ускорить выполнение подобных операций? Необходимо внедрить параллелизм в той или иной форме.
Существует несколько подходов к внедрению идей параллельного выполнения операций в обработку векторов. Проще рассмотреть их на конкретном примере перемножения квадратных матриц размером. Формула для вычисления каждого элемента матрицы результата имеет вид:
Здесь, и - элементы матриц А, В и С.
Ниже представлен текст программы на языке 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. Координация такого слияния процессов возлагается на операционную систему, и выполнения общего процесса не возобновляется до тех пор, пока все параллельные независимые процессы не завершатся.
Подключаемые модули Quick Look
Создание образов дисков из объектов
Стирание диска или тома
Векторный сопроцессор IBM 3090
Автор: Andres | 25-03-2015, 13:47 |
Проверенная старенькая nero 7, не подводит уже лет 10 |