Програмування масивів

парадигма програмування, що узагальнює операції над скалярами для прозорого застосування до багатовимірних масивів

Програмування масивів — засіб в інформатиці, що дозволяє застосовувати операції до всього набору значень одночасно. Зазвичай використовується в наукових та інженерних задачах.

Сучасні мови програмування, які підтримують програмування масивів (також відомі як векторні або багато-вимірні мови), розробили спеціально для узагальнення операцій над скалярами для прозорого застосування до векторів, матриць і масивів вищої розмірності.

До них належать APL, J, Fortran, MATLAB, Analytica(інші мови), Octave, R, Cilk Plus, Julia, Perl Data Language (PDL)(інші мови). У цих мовах операцію, яка працює над цілими масивами, можна назвати векторизованою операцією,[1] незалежно від того, чи виконується вона на векторному процесорі, який реалізує векторні інструкції.

Операції програмування масивів стисло виражають ідеї щодо маніпулювання даними. Рівень стислості може бути вражаючим: можна знайти такі однорядкові програми, які вимагають кількох сторінок об'єктно-орієнтованого коду з циклами.

Втілення

ред.

Програмування масивів дуже добре підходить для неявного розпаралелювання(інші мови). Крім того, Intel і сумісні ЦП, розроблені та вироблені після 1997 року, містили різні розширення набору інструкцій, починаючи від MMX і закінчуючи SSSE3 і 3DNow!, які містять базові операції SIMD. В 2020-х роках з'явився AVX-512, що перетворило сучасні ЦП на векторні процесори.

Програмування масивів відрізняється від паралельної обробки тим, що один фізичний процесор виконує операції над групою елементів одночасно, тоді як паралельна обробка має на меті розділити більшу проблему на менші (MIMD), які вирішуються по частинах багатьма процесорами.

На 2023 рік процесори з кількома ядрами та графічні процесори з тисячами загальних обчислювальних ядер поширені на персональних комп'ютерах.

Мови

ред.
Ada[2]
A := A + B;
APL
A  A + B
MATLAB
A = A + B;

Ділення матриць і синтаксис

ред.

Оператор лівого ділення квадратної матриці використовується для розв'язку СЛАР A * x = b, помноживши обидві частини зліва на обернену до A:

A^-1 *(A * x) == A^-1 * (b)
(A^-1 * A)* x == A^-1 * b
x = A^-1 * b

де == — оператор рівності.

Для довільних матриць псевдообернення A+ (у мовах MATLAB і GNU Octave: pinv(A)) використовується аналогічно:

pinv(A) *(A * x) == pinv(A) * (b)
(pinv(A) * A)* x == pinv(A) * b
x = pinv(A) * b

Проте ці рішення не є ані лаконічнішими, ані ефективнішими з точки зору обчислень. Бо виконуються дві операції (обернення та множення), замість однієї (ділення зліва). Оскільки множення матриць не комутативне, MATLAB вводить оператор лівого ділення \, щоби підтримувати аналогії зі скалярним випадком, таким чином спрощуючи математичне міркування та зберігаючи стислість:

A \ (A * x)==A \ b
(A \ A)* x ==A \ b       (множення є асоціативним, комутативність більше не потрібна)
x = A \ b

Це приклад не лише стислого запису, але й ефективнішого обчислення, який реалізований в бібліотеках ATLAS(інші мови) та LAPACK.[3]

Бібліотеки

ред.

Використання спеціалізованих і ефективних бібліотек для стисліших абстракцій також поширене в інших мовах програмування.

Примітки

ред.
  1. Stéfan van der Walt; S. Chris Colbert & Gaël Varoquaux (2011). The NumPy array: a structure for efficient numerical computation. Computing in Science and Engineering (англ.). IEEE. 13 (2): 22—30. arXiv:1102.1523. Bibcode:2011CSE....13b..22V. doi:10.1109/mcse.2011.37. S2CID 16907816.
  2. Ada Reference Manual: G.3.1 Real Vectors and Matrices (англ.)
  3. GNU Octave Manual. Appendix G Installing Octave (англ.). Процитовано 19 березня 2011.
  4. Reference for Armadillo 1.1.8. Examples of Matlab/Octave syntax and conceptually corresponding Armadillo syntax (англ.). Процитовано 19 березня 2011.
  5. Blitz++ User's Guide. 3. Array Expressions (англ.). Архів оригіналу за 23 березня 2011. Процитовано 19 березня 2011.