순차적 곱셈보다 효율적인 병렬 행렬 지수 알고리즘이 있습니까?


11

실수 행렬의 거듭 제곱 (양의 정수)을 찾으려면 하나가 필요합니다. 효율적인 행렬 곱셈 알고리즘이 많이 있지만 (예 : 일부 병렬 알고리즘은 Cannon 's, DNS ) 행렬의 힘을 찾기위한 알고리즘이 있으며 행렬 곱셈의 순차적 실행보다 더 효율적인 알고리즘이 있습니까? 병렬 알고리즘에 특히 관심이 있습니다.


1
무엇을 시도 했습니까? 어디에 갇히게 되었습니까? 어떤 연구를 했습니까? 제목 외에 질문이 어디에 있습니까? 문제의 결정 버전 (제목에서)에 대한 대답은 "예"이지만 이미 알고 있습니다. 맞습니까?
Evil

2
@TomR 이 질문은 아마도 당신에게 관심 있을 것입니다
adrianN

1
아마도 이런 식으로 뭔가 ? 아니면 다른 것을 찾고 있습니까? 응용 프로그램의 크기와 성능은 무엇입니까?
Evil

1
n ≥ 4 일 때 n-1 곱셈보다 적은 n 제곱을 계산할 수 있습니다. 큰 행렬의 경우 가능한 가장 작은 곱셈 수를 찾는 것이 좋습니다 (예 : 6을 사용하여 n ^ 15를 계산하는 간단한 방법이 있습니다) 곱셈이지만 5)로 수행 할 수 있습니다. 그런 다음 동일한 원리를 적용하여 가장 적은 수의 순차적 곱셈을 찾을 수 있습니다.
gnasher729

1
사용 가능한 병렬 처리량도 고려해야합니다. "병렬"은 그렇지 않으면 사용되지 않는 자원을 이용하는 것입니다. 행렬 곱셈의 구현이 이미 이용 가능한 모든 자원을 효율적으로 사용할 수 있다면, 행렬의 거듭 제곱을 계산하기 위해 활용할 다른 것은 없습니다.
gnasher729

답변:


5

병렬로 작동 할 수있는 프로세서가 여러 개인 경우 k 단계로 전력 (2 ^ k)까지의 전력을 계산할 수 있습니다. 예를 들어 : 를 계산하려면 다음 을 계산하십시오.M15

1 단계 : 계산M2

2 단계 : 및M3=M2MM4=M2M2

3 단계 : 및M7=M4M3M8=M4M4

4 단계 :M15=M8M7

이것은 세 번의 곱셈에서 를 계산 하고 다른 두 번의 곱셈에서 를 세 번째 거듭 제곱으로 올리는 것보다 하나의 곱셈 이지만 프로세서가 두 개인 경우 더 빠릅니다. 임의의 고전력을 위해서는 더 많은 프로세서가 필요합니다.M5M5

곱하기, 행별로 곱하기에 무차별 대입 알고리즘을 사용하면 제품의 한 행을 계산 한 다음 즉시 다음 제품에 해당 행을 사용하여 시간을 절약 할 수 있습니다. 이것은 의 첫 번째 행 이 계산 되는 즉시 계산을 시작할 수있는 의 계산에 도움 이됩니다. 의 행과 열이 모두 필요하기 때문에 에는 도움이되지 않습니다 . 큰 힘의 경우 계산할 힘을 정렬 할 수 있습니다.M3M3M2M4M2

그리고 이것을 게시 한 후 여러 프로세서를 매우 쉽게 사용할 수 있음이 분명해집니다. 의 첫 번째 행을 계산하여 시작합니다 . 그 열이있을 때, 당신이 첫 번째 행을 계산하는데 필요한 모든 정보가 사용하면 두 번째 행 산출하므로, 그리고 첫 번째 행 병렬한다. 그런 다음 의 세 번째 행, 의 두 번째 행 및 의 첫 번째 행을 병렬로 계산할 수 있습니다 .M2=MMM3=M2MM2M3M2M3M4

이렇게하면 필요한 것보다 훨씬 많은 작업이 수행됩니다 (예 : 4 단계 방법의 최소 5 개 또는 6 개 대신 대해 14 개의 행렬 곱셈 ). 프로세서 수에 비해 전력이 크지 않으면 여전히 더 빠릅니다. 그러나이 방법을 사용하여 4 개의 프로세서로 을 계산하는 것은 비효율적입니다. 이를 최적의 방법으로 수행하는 것은 흥미로운 문제입니다.M15M1000

접근 방식 결합 : 예를 들어 4 개의 프로세서를 사용하면 각 제품을 한 번에 한 행씩 계산하여 AB, ABC, ABCD 및 ABCDE를 거의 동시에 계산할 수 있습니다. 이를 통해 하나의 프로세서가있는 하나의 제품과 거의 같은 시간에 네 개의 프로세서를 사용하여 - 네 개 모두를 계산할 수 있습니다 .M2M5

이 네 가지 결과와 원래 M이 주어지면 행렬이 서로 최대 5의 거듭 제곱 인 경우 행렬 ~ 중 4 개를 동시에 다시 계산할 수 있습니다 . 따라서 까지의 각 전력 은 단일 프로세서 매트릭스 제품 시간의 약 2 배로 계산할 수 있습니다.M6M25M25

이러한 행렬을 계산 하면 4 개의 프로세서를 사용할 수있는 경우 단일 행렬 제품 시간의 3 배로 최대 및 일부 모든 행렬을 계산할 수 있습니다. k 프로세서를 사용하면 최소한 까지 올라갑니다 .M108M125k(k+1)2


4

행렬 지수를 사용하여 병렬 속도 향상을 분석 할 수있는 두 가지 수준이 있습니다. 곱할 행렬을 결정하는 "매크로 알고리즘"수준과 병렬 처리로 곱셈 속도를 높일 수있는 "마이크로 알고리즘"수준입니다.

후자의 경우, Wikipedia는 에 행렬 을 곱하면 이론적으로 무한한 수의 프로세서 로 의 복잡성을 ,보다 현실적인 병렬 알고리즘으로 을 얻을 수 있다고 제안합니다. .nnO(log2(n))O(n)

(참고 : wikipedia 페이지는 일반적인 행렬 계산을위한 것입니다. 행렬을 제곱하는 정보를 사용하여 더 병렬화 할 수 있는지 잘 모르겠습니다.)

전자의 경우, 문제는 일부 행렬 대해 을 계산 데 몇 번의 행렬 곱셈이 필요한가 ? (나는 주어진 라운드에서 모든 곱셈이 병렬로 수행 될 수 있기 때문에 라운드라고 말합니다.)AmA

다른 답변에서 언급했듯이 이길 수있는 순차적 알고리즘은 squaring하여 지수 입니다. 이를 통해 곱셈 에서 를 계산할 수 있습니다 .AkO(log(k))

문제는 우리가 이것을 병렬 처리로 이길 수 있습니까? 나는 대답이 아니오라고 주장한다.

간단한 이유는 제곱에 의한 지수화는 본질적으로 동적 인 프로그래밍 알고리즘이기 때문입니다. 하위 결과를 재사용하여 모든 작업을 건너 뛸 수 있지만 결과적으로 병렬 처리를 허용하지 않는 데이터 종속성이 생성됩니다. 데이터 종속성을 제거하면해야 할 작업량도 크게 증가합니다.

이를 더 잘 설명하기 위해 지수화하지 않은 경우 행렬 곱셈을 병렬화하는 방법을 살펴 보겠습니다. 개의 정사각 행렬을 곱하여 병렬화하려고한다고 가정 해보십시오 .k

A1A2A3A4A5...Ak

이것을 병렬화하는 자연스러운 방법은 명백 합니다. 첫 번째 라운드에서 곱셈 을 수행하려면 연관성을 남용해야합니다 .k2

(A1A2)(A3A4)(A5A6)...(Ak1Ak)

이것으로부터, 우리는 문제의 크기를 각 라운드의 절반으로 줄이기 때문에 행렬에 곱셈을 곱할 수 있습니다.kO(log(k))

그러나이 방법으로 지수를 수행하면 다음과 같습니다.

(AA)(AA)(AA)...(AA)

다시 말해, 우리의 모든 병렬 처리는 를 계산하기 위해 동일한 행렬 곱을 다시 계산하고 있습니다 ! 따라서, 제곱에 의한 지수와 같은 메모 알고리즘을 사용하면 각 곱셈 라운드 에서 병렬 알고리즘과 동일한 작업을 수행 할 수 있습니다 .A2

이 모든 것을 종합하면 행렬 로 에 대한 를 계산 하려면 낙관적 병렬 알고리즘 의 병렬 복잡도는 또는 현실적인 것을 위해 .AknnAO(log2(n)log(k))O(nlog(k))


3

순차적으로 곱하는 것을 의미한다면 , 처음에 의 관련 거듭 제곱 (일명 제곱에 의한 지수 ) 만 계산 하는 솔루션이 큰 대해 분명히 좋습니다 .mlogm2m

이를 개선하는 것은 특정 유형의 행렬에만 해당 될 수 있습니다. 예를 들어, 행렬을 대각선화할 수있는 경우 따라서 거듭 제곱은 입니다. . m O ( 1 ) m

A=SΛS1Am=SΛmS1
mO(1)m
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.