Алгоритам множења матрица

С Википедије, слободне енциклопедије

Алгоритам множења матрица је опис решавања математичких операција код множења матрица.

С обзиром да је множење матрица централна операција у многим нумеричким алгоритмима, много труда је уложено у израду ефикасног алгоритма множења матрица. Примена множења матрица у рачунским проблемима може се видети у многим пољима међу којима су и научно рачунање и препознавање образаца, као и у наизглед неповезаним проблемима попут рачунања путања у графу. Многи различити алгоритми су прављени за множење матрица на различитим типовима хардвера, укључујући паралелне и дистрибуиране системе, где се процес рачунског посла одвија проширено на више процесора, нпр. преко мреже.

Директна примена математичке дефиниције множења матрица даје нам алгоритам коме је потребно времена реда н3 да би помножио две н × н матрице. Боље асимптотске границе времена потребног за множење матрица позната су још од рада Штрасена у 1960-им годинама, али још увек није познато оптимално време, тј. комплексност проблема.

Проблем најбржег алгоритма за множење матрица представља један од нерешених проблема у рачунарским наукама.

Итеративни алгоритам[уреди | уреди извор]

Дефиниција множења матрица је: ако је C = АБ за н × м матрицу А и м × п матрица Б, онда је C н × п матрица са уносом:

.

Из овога, једноставан алгоритам може бити конструисан који се понавља у петљи преко индекса и од 1 до н и ј од 1 до п, рачунајући једначину изнад користећи угњеждену петљу:

   Input: matrices A and B
   Let C be a new matrix of the appropriate size
   For i from 1 to n:
       For j from 1 to p:
           Let sum = 0
           For k from 1 to m:
               Set sum ← sum + Aik × Bkj
           Set Cij ← sum
   Return C

Овај алгоритам се извршава у Θ(нмп) времену у асимптотској нотацији. Уобичајено поједностављење у циљу анализе алгоритама јесте претпоставка да су улази све квадратне матрице димензија н × н, у ком случају је време извршења Θ(н3).

Кеш понашање[уреди | уреди извор]

Три петље у итеративном множењу матрица могу се произвољно заменити без утицаја на тачност или асимптотско време извршења алгоритма. Међутим, ред може имати значајан утицај на практичну перформансу због образаца приступа меморији и кеш коришћења алгоритма. Који редослед је најбољи такође зависи од тога да ли се матрице чувају у редоследу прво ред, редоследу прво колона, или мешавина оба.

Конкретно, у идеалном случају потпуно асоцијативог кеша који се састоји од M кеш линија по б бајтова сваки, горепоменути алгоритам је подоптималан за А и Б који се чувају у редоследу прво ред. Када је н > 1/M'б, свака итерација унутрашње петље води до промашаја кеша када се приступа реду Б. То значи да алгоритам сноси Θ(н3) кеш промашаја у најгорем случају. Од 2010. године, меморијске брзине упоређене са брзинама процесора су такве да кеш промашаји, а не стварни прорачуни, доминирају временом извршења за прилично велике матрице.

Оптимална варијанта итеративног алгоритма за А и Б у распореду прво ред је верзија са плочицама, где је матрица имплицитно подељена на квадратне плочице величине M M

   Input: matrices A and B
   Let C be a new matrix of the appropriate size
   Pick a tile size T = Θ(√M)
   For I from 1 to n in steps of T:
       For J from 1 to p in steps of T:
           For K from 1 to m in steps of T:
               Multiply AI:I+T, K:K+T and BK:K+T, J:J+T into CI:I+T, J:J+T, that is:
               For i from I to min(I + T, n):
                   For j from J to min(J + T, p):
                       Let sum = 0
                       For k from K to min(K + T, m):
                           Set sum ← sum + Aik × Bkj
                       Set Cij ← sum
   Return C

У идеализованом кеш моделу, овај алгоритам сноси само Θ(н3/б √М) кеш промашаја, делилац б √М износи неколико редова величине на модерним машинама, тако да стварни прорачуни доминирају временом извршења, а не кеш промашаји.

Завади па владај алгоритам[уреди | уреди извор]

Алтернатива итеративном алгоритму је "Завади па владај" алгоритам за множење матрица. Ово се односи на поделу блокова:

.

што ради за све квадратне матрице чије су димензије степени броја 2, нпр. облици су 2н × 2н за неко н. Производ матрица је сад:

који се састоји од 8 множења парова подматрица, праћено кораком сабирања. Завади па владај алгоритам рачуна најмања множења рекурзивно, користећи скаларно множење ц11 = а11б11 као базни случај. Комплексност овог алгоритма у функцији од н је дат рекурзијом:

;
,

рачунајуци 8 рекурзивних позива матрице велицине н/2 и Θ(н2) да би се сабрала 4 пара резултујућих матрица. Примена ове теореме показује да рекурзија има решење Θ(н3) као и итеративни алгоритам.

Неквадратне матрице[уреди | уреди извор]

Варијанта овог алгоритма која ради за матрице произвољних димензија и бржа је у пракси дели матрице на две уместо на четири подматрице, као што је приказано испод. Нека су димензије матрица н × м за А и м × п за Б. Дељење матрице значи делити је на два дела једнаких величина, или што је ближе могуће у случају матрица непарних димензија.

  • Базни случај: ако је маx(н, м, п) испод одређене границе, користити верзију одмотавања петљи итеративног алгоритма.
  • Рекурзивни случај:
  • Иф маx(н, м, п) = н, поделити А хоризонтално:
  • Елсе, иф маx(н, м, п) = п, поделити Б вертикално:
  • Елсе, маx(н, м, п) = м. Поделити А вертикално и Б хоризонтално:

Кеш понашање[уреди | уреди извор]

Степен промашаја кеша у рекурзивном множењу матрица је исти као и у итеративној верзији са плочицама, али за разлику од итеративног алгоритма, рекурзивни је несвестан кеша, што значи да нема подешавања параметара потребних да би се добила оптимална перформанса кеша, и понаша се добро у мултипрограмским окружењима, где су кеш величине ефикасно днамичне због других процеса који заузимају кеш простор. Једноставни итеративни алгоритам је такође несвестан кеша али много спорији у пракси ако распоред матрица није пролагођен алгоритму.

Број кеш промашаја у овом алгоритму на машини са M линија идеалног кеша, сваки величине б бајтова је

Други алгоритми за множење матрица[уреди | уреди извор]

  • Подкубни алгоритам
  • Паралелни и дистрибуирани алгоритми

Види још[уреди | уреди извор]

Референце[уреди | уреди извор]

Додатна литература[уреди | уреди извор]

Спољашње везе[уреди | уреди извор]