실수 행렬의 거듭 제곱 (양의 정수)을 찾으려면 하나가 필요합니다. 효율적인 행렬 곱셈 알고리즘이 많이 있지만 (예 : 일부 병렬 알고리즘은 Cannon 's, DNS ) 행렬의 힘을 찾기위한 알고리즘이 있으며 행렬 곱셈의 순차적 실행보다 더 효율적인 알고리즘이 있습니까? 병렬 알고리즘에 특히 관심이 있습니다.
실수 행렬의 거듭 제곱 (양의 정수)을 찾으려면 하나가 필요합니다. 효율적인 행렬 곱셈 알고리즘이 많이 있지만 (예 : 일부 병렬 알고리즘은 Cannon 's, DNS ) 행렬의 힘을 찾기위한 알고리즘이 있으며 행렬 곱셈의 순차적 실행보다 더 효율적인 알고리즘이 있습니까? 병렬 알고리즘에 특히 관심이 있습니다.
답변:
병렬로 작동 할 수있는 프로세서가 여러 개인 경우 k 단계로 전력 (2 ^ k)까지의 전력을 계산할 수 있습니다. 예를 들어 : 를 계산하려면 다음 을 계산하십시오.
1 단계 : 계산
2 단계 : 및
3 단계 : 및
4 단계 :
이것은 세 번의 곱셈에서 를 계산 하고 다른 두 번의 곱셈에서 를 세 번째 거듭 제곱으로 올리는 것보다 하나의 곱셈 이지만 프로세서가 두 개인 경우 더 빠릅니다. 임의의 고전력을 위해서는 더 많은 프로세서가 필요합니다.
곱하기, 행별로 곱하기에 무차별 대입 알고리즘을 사용하면 제품의 한 행을 계산 한 다음 즉시 다음 제품에 해당 행을 사용하여 시간을 절약 할 수 있습니다. 이것은 의 첫 번째 행 이 계산 되는 즉시 계산을 시작할 수있는 의 계산에 도움 이됩니다. 의 행과 열이 모두 필요하기 때문에 에는 도움이되지 않습니다 . 큰 힘의 경우 계산할 힘을 정렬 할 수 있습니다.
그리고 이것을 게시 한 후 여러 프로세서를 매우 쉽게 사용할 수 있음이 분명해집니다. 의 첫 번째 행을 계산하여 시작합니다 . 그 열이있을 때, 당신이 첫 번째 행을 계산하는데 필요한 모든 정보가 사용하면 두 번째 행 산출하므로, 그리고 첫 번째 행 병렬한다. 그런 다음 의 세 번째 행, 의 두 번째 행 및 의 첫 번째 행을 병렬로 계산할 수 있습니다 .
이렇게하면 필요한 것보다 훨씬 많은 작업이 수행됩니다 (예 : 4 단계 방법의 최소 5 개 또는 6 개 대신 대해 14 개의 행렬 곱셈 ). 프로세서 수에 비해 전력이 크지 않으면 여전히 더 빠릅니다. 그러나이 방법을 사용하여 4 개의 프로세서로 을 계산하는 것은 비효율적입니다. 이를 최적의 방법으로 수행하는 것은 흥미로운 문제입니다.
접근 방식 결합 : 예를 들어 4 개의 프로세서를 사용하면 각 제품을 한 번에 한 행씩 계산하여 AB, ABC, ABCD 및 ABCDE를 거의 동시에 계산할 수 있습니다. 이를 통해 하나의 프로세서가있는 하나의 제품과 거의 같은 시간에 네 개의 프로세서를 사용하여 - 네 개 모두를 계산할 수 있습니다 .
이 네 가지 결과와 원래 M이 주어지면 행렬이 서로 최대 5의 거듭 제곱 인 경우 행렬 ~ 중 4 개를 동시에 다시 계산할 수 있습니다 . 따라서 까지의 각 전력 은 단일 프로세서 매트릭스 제품 시간의 약 2 배로 계산할 수 있습니다.
이러한 행렬을 계산 하면 4 개의 프로세서를 사용할 수있는 경우 단일 행렬 제품 시간의 3 배로 최대 및 일부 모든 행렬을 계산할 수 있습니다. k 프로세서를 사용하면 최소한 까지 올라갑니다 .
행렬 지수를 사용하여 병렬 속도 향상을 분석 할 수있는 두 가지 수준이 있습니다. 곱할 행렬을 결정하는 "매크로 알고리즘"수준과 병렬 처리로 곱셈 속도를 높일 수있는 "마이크로 알고리즘"수준입니다.
후자의 경우, Wikipedia는 에 행렬 을 곱하면 이론적으로 무한한 수의 프로세서 로 의 복잡성을 ,보다 현실적인 병렬 알고리즘으로 을 얻을 수 있다고 제안합니다. .
(참고 : wikipedia 페이지는 일반적인 행렬 계산을위한 것입니다. 행렬을 제곱하는 정보를 사용하여 더 병렬화 할 수 있는지 잘 모르겠습니다.)
전자의 경우, 문제는 일부 행렬 대해 을 계산 데 몇 번의 행렬 곱셈이 필요한가 ? (나는 주어진 라운드에서 모든 곱셈이 병렬로 수행 될 수 있기 때문에 라운드라고 말합니다.)
다른 답변에서 언급했듯이 이길 수있는 순차적 알고리즘은 squaring하여 지수 입니다. 이를 통해 곱셈 에서 를 계산할 수 있습니다 .
문제는 우리가 이것을 병렬 처리로 이길 수 있습니까? 나는 대답이 아니오라고 주장한다.
간단한 이유는 제곱에 의한 지수화는 본질적으로 동적 인 프로그래밍 알고리즘이기 때문입니다. 하위 결과를 재사용하여 모든 작업을 건너 뛸 수 있지만 결과적으로 병렬 처리를 허용하지 않는 데이터 종속성이 생성됩니다. 데이터 종속성을 제거하면해야 할 작업량도 크게 증가합니다.
이를 더 잘 설명하기 위해 지수화하지 않은 경우 행렬 곱셈을 병렬화하는 방법을 살펴 보겠습니다. 개의 정사각 행렬을 곱하여 병렬화하려고한다고 가정 해보십시오 .
이것을 병렬화하는 자연스러운 방법은 명백 합니다. 첫 번째 라운드에서 곱셈 을 수행하려면 연관성을 남용해야합니다 .
이것으로부터, 우리는 문제의 크기를 각 라운드의 절반으로 줄이기 때문에 행렬에 곱셈을 곱할 수 있습니다.
그러나이 방법으로 지수를 수행하면 다음과 같습니다.
다시 말해, 우리의 모든 병렬 처리는 를 계산하기 위해 동일한 행렬 곱을 다시 계산하고 있습니다 ! 따라서, 제곱에 의한 지수와 같은 메모 알고리즘을 사용하면 각 곱셈 라운드 에서 병렬 알고리즘과 동일한 작업을 수행 할 수 있습니다 .
이 모든 것을 종합하면 행렬 로 에 대한 를 계산 하려면 낙관적 병렬 알고리즘 의 병렬 복잡도는 또는 현실적인 것을 위해 .