IDL/Math

행렬곱의 속도 향상에 관하여 (IDL 8.7.3)

이상우_idl 2020. 2. 26. 16:28
728x90
반응형

앞서 올렸던 IDL 8.7.3 출시와 관련된 게시물에서 행렬곱의 속도 향상에 관하여 간단하게 언급했었는데, 이와 관련하여 간략한 예제와 함께 조금 더 소개를 해보고자 합니다. 이미 언급을 했듯이, IDL 8.7.3에서는 인텔의 MKL(Math Kernel Library) 기능이 처음으로 도입되었으며 먼저 행렬곱의 속도를 향상시키는데 우선적으로 적용이 되었습니다. IDL에서는 행렬곱 연산을 수행하는데 있어서 두가지 정도의 방법이 제공되어 왔습니다. 첫번째 방법은 행렬곱 연산자인 ## 또는 #를 사용하는 것이고, 두번째 방법은 MATRIX_MULTIPLY 함수를 사용하는 것입니다. 그리고 8.7.3에서는 세번째 방법이 새롭게 도입되었는데 바로 BLAS_GEMM 함수입니다. 그런데 어차피 MKL 기능의 도입으로 인한 행렬곱 속도의 향상은 이 세가지 방법 모두 적용되어 있기 때문에 어느 방법을 사용해도 그 효과를 확인할 수 있습니다. 테스트를 위하여 다음과 같은 예제 코드를 작성해보았습니다.


n = 1024

A = RANDOMU(1, n, n)*10

B = RANDOMU(2, n, n)*10


TIC

C_trad = A##B

PRINT, ''

PRINT, 'Matrix C_trad'

TOC


TIC

C_matmul = MATRIX_MULTIPLY(B, A)

PRINT, ''

PRINT, 'Matrix C_matmul'

TOC


여기서는 난수값들로 구성된 두개의 행렬(2차원 배열) A, B를 먼저 생성합니다. 여기서는 두 행렬 모두 1024x1024의 구조를 갖습니다. 이 두 행렬에 대하여 ## 연산자를 사용하는 방법 및 MATRIX_MULTIPLY 함수를 사용하는 방법 두가지를 적용하여 행렬곱을 산출하되, 각 방법별로 TIC, TOC 명령을 수행하여 연산 소요 시간을 측정하여 보여주도록 한 것입니다. 이 예제 코드를 IDL 8.7.3에서 실행해보고 그 이전 버전의 IDL에서도 실행하여 소요 시간을 비교해보면 됩니다. 우선 제가 IDL 8.7.3에서 실행해본 결과는 다음과 같습니다.


Matrix C_trad

% Time elapsed: 0.030243158 seconds.


Matrix C_matmul

% Time elapsed: 0.031012058 seconds.


물론 이 결과는 컴퓨터의 사양에 따라 달라질 수도 있고 실행할 때마다 매번 달라질 수도 있습니다. 하지만 비교를 위하여 동일한 머신에서 IDL 8.7.2에서 이 예제 코드를 실행해본 결과는 다음과 같습니다.


Matrix C_trad

% Time elapsed: 0.46649694 seconds.


Matrix C_matmul

% Time elapsed: 0.39350986 seconds.


이와 같이 소요 시간이 확연히 차이가 납니다. 대략 12~16배 정도의 차이가 나는 것을 볼 수 있습니다. 연산에 투입되는 행렬의 크기를 늘려보면 더 두드러지게 나타나는데요. 맨 앞에 있는 n의 값을 1024 대신 2048로 변경하여 다시 실행해봅시다. 먼저 IDL 8.7.3에서의 결과입니다.


Matrix C_trad

% Time elapsed: 0.15284181 seconds.


Matrix C_matmul

% Time elapsed: 0.16339707 seconds.


그리고 IDL 8.7.2에서의 결과입니다.


Matrix C_trad

% Time elapsed: 2.9080601 seconds.


Matrix C_matmul

% Time elapsed: 2.8530371 seconds.


두 결과를 서로 비교해보면, 약 17~19배 정도의 차이가 납니다. 이번에는 n의 값을 더 높여서 8192로 해보았습니다. 먼저 IDL 8.7.3에서의 결과입니다.


Matrix C_trad

% Time elapsed: 8.8100200 seconds.


Matrix C_matmul

% Time elapsed: 8.7874651 seconds.


그리고 IDL 8.7.2에서의 결과입니다.


Matrix C_trad

% Time elapsed: 165.58021 seconds.


Matrix C_matmul

% Time elapsed: 164.42999 seconds.


두 결과를 서로 비교해보면 이번엔 약 19배 정도의 차이가 납니다. IDL 도움말에서는 10~50배 정도의 차이가 난다고 기술되어 있는데, 아마 행렬의 크기나 컴퓨터의 사양 등에 따라 다르게 나타날 수도 있을 것입니다.


어쨌든 중요한 것은 MKL 기능의 적용에 의하여 연산속도 측면에서 꽤 큰 향상이 있었다는 것입니다. 일단 이번 8.7.3에서는 행렬곱 연산에 한하여 이러한 향상이 있었는데, 행렬곱 연산이 포함되는 각종 처리 루틴이나 ENVI의 관련 Task들의 속도에 있어서 큰 향상이 있을 것으로 기대됩니다. 그리고 향후의 IDL에서 MKL이 좀 더 다양한 연산에 적용된다면, IDL의 수치계산 기능에 있어서 속도 및 효율의 비약적인 향상이 있을 것으로 기대해봐도 좋을 것 같습니다.

반응형