RAD Studio XE7에 새롭게 추가된 주요 기능 중 하나인 병렬(패러럴) 컴퓨팅 라이브러리는 코드를 멀티코어 CPU를 모두 활용해 동작할 수 있도록 구현하는 기술입니다.(오브젝트 파스칼과 C++에서 데스크탑과 모바일에서 사용할 수 있습니다.)
이번 글에서는 병렬 컴퓨팅 라이브러리를 활용하는 예제를 소개합니다.
예제는 컬러이미지를 회색톤으로 변환하는 그래픽 작업에서 병렬 컴퓨팅 라이브러리를 이용해 성능을 개선합니다.
(그래픽 작업과 같이 연산이 많은 작업을 비동기로 멀티코어를 활용한다면 크게 성능개선을 할 수 있습니다.)
아래 코드와 같이 기존 코드를 손쉽게 비동기 작업으로 변환 할 수 있습니다.
기존 코드(No Parallel)
procedure ToGrayPixelsNoParallel(aBitmap: Graphics.TBitmap; cg: TColor2Grayscale = c2gLuminosity); var w, h: integer; begin if aBitmap <> nil then for h := 0 to aBitmap.Height - 1 do for w := 0 to aBitmap.Width - 1 do aBitmap.Canvas.Pixels[w,h] := ColorToGray(aBitmap.Canvas.Pixels[w,h], cg); end;
개선된 코드(Parallel 사용)
procedure ToGrayPixelsParallel(aBitmap: Graphics.TBitmap; cg: TColor2Grayscale = c2gLuminosity); var h: integer; begin if aBitmap <> nil then TParallel.For(0, aBitmap.Height-1, procedure(h: integer) var w: integer; begin for w := 0 to aBitmap.Width - 1 do aBitmap.Canvas.Pixels[w,h] := ColorToGray(aBitmap.Canvas.Pixels[w,h], cg); end ); end;
관련 글
- 병렬 컴퓨팅 라이브러리 소개
- 원글 - Making "Color to Gray" conversion algorithm parallel
- 병렬 컴퓨팅 라이브러리 온라인 도움말
- Converting to grayscale with TBitmap.ScanLine property