Kandroid Archive (Old article backup) 
OpenMP를 이용한 멀티코어 프로그래밍
작성자 다이나믹링크
작성일 2012-05-04 (금) 13:13
ㆍ추천: 10  ㆍ조회: 6594      
IP: 220.xxx.102
칸드로이드 신규 서버 세팅 기념으로 OpenMP 테스트 프로그램을 올려봅니다.
유명하신 칸드로이드의 인베인님께서 올려주신 툴체인(ktoolchain version 2.1-20110815)을 사용하였습니다.

예제는 40개의 피보나치 수열을 구하는 것입니다. 흔한 예제죠~~ ㅋㅋ
혹시 고딩때 배웠던 피보나치 수열에 대한 기억이 가물가물 하다면 아래 링크를 참고하세요.
http://en.wikipedia.org/wiki/Fibonacci_number

40개의 피보나치 수열은 아래와 같습니다.

1
2
3
5
8
13
21
34
55
89
144
233
377
610
987
1597
2584
4181
6765
10946
17711
28657
46368
75025
121393
196418
317811
514229
832040
1346269
2178309
3524578
5702887
9227465
14930352
24157817
39088169
63245986
102334155


이 수열을 구하는 소스 코드는 다음과 같습니다.
더 좋은 방법이 많이 있을 수 있습니다. :)

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <omp.h>  // OpenMP 사용을 위한 헤더 파일
#include <unistd.h>
#include <fcntl.h>


int Fibonacci(int n)
{
    int x, y;
    if (n < 2)
        return n;
    else {
        x = Fibonacci(n - 1);
        y = Fibonacci(n - 2);
        return (x + y);
    }
}

int FibonacciTask(int n)
{
    int x, y;
    if (n < 2)
        return n;
    else {
#pragma omp task shared(x)
        x = Fibonacci(n - 1);
#pragma omp task shared(y)
        y = Fibonacci(n - 2);
#pragma omp taskwait
        return (x + y);
    }
}

#define MAX 41
int main(int argc, char * argv[])
{
    int FibNumber[MAX] = {0};
    struct timeval time_start, time_end;

    int i = 0;

    // omp configuration
    printf("Number of CPUs=%dn", omp_get_num_procs());
    printf("Number of max threads=%dn", omp_get_max_threads());


    gettimeofday(&time_start, NULL);
#pragma omp parallel
    {
#pragma omp single private(i)
        for(i = 1; i < MAX; i++) {
            FibNumber[i] = FibonacciTask(i);
        }
    }
    gettimeofday(&time_end, NULL);

    time_end.tv_usec = time_end.tv_usec-time_start.tv_usec;
    time_end.tv_sec = time_end.tv_sec-time_start.tv_sec;
    time_end.tv_usec += (time_end.tv_sec*1000000);
    printf("Time of Fibonacci with OpenMP : %lf secn", time_end.tv_usec / 1000000.0);

    for(i = 0; i < MAX; i++)
        printf("%d ", FibNumber[i]);

    printf("n--------------------------------------n");

    return 0;
}


테스트에 사용하였던 Makefile의 빌드 옵션입니다.

GCC = /usr/local/arm/ktoolchain-cortexa9-ver2.1-20110815/bin/arm-none-linux-gnueabi-gcc

Fibonacci_omp: Fibonacci_omp.c
    $(GCC) -o Fibonacci_omp $< -lgomp -lpthread -fopenmp -lm -static -O3



최종 테스트 결과 입니다. 삼성 듀얼코어 Exynos-4210이 탑재된 ODROID-A4 개발보드에서 구동시켰습니다.
첫번째 테스트는 싱글코어만 사용하였고, 두번째는 듀얼코어를 사용하였습니다.

root@android:/system/bin
# ./Fibonacci                                        
Time of Fibonacci without OpenMP : 7.862591 sec
0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765
10946 17711 28657 46368 75025 121393 196418 317811 514229 832040 1346269
2178309 3524578 5702887 9227465 14930352 24157817 39088169 63245986
102334155
--------------------------------------
root@android:/system/bin
# ./Fibonacci_omp                                    
Number of CPUs=2
Number of max threads=2
Time of Fibonacci with OpenMP : 4.878260 sec
0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765
10946 17711 28657 46368 75025 121393 196418 317811 514229 832040 1346269
2178309 3524578 5702887 9227465 14930352 24157817 39088169 63245986
102334155
--------------------------------------


위 결과를 보면 피보나치 연산의 경우, OpenMP 기반의 듀얼코어 병렬 컴퓨팅을 이용하면 약 1.6배 이상 빠르게 계산할 수 있다는 것을 알수 있습니다.
물론 연산의 종류, 프로그램 구성, 구동 환경에따라 많은 차이가 있겠지만, 듀얼코어를 사용하여 1.5배 정도의 성능개선은 비교적 손쉽가 가능하다고 할 수 있겠습니다.

쿼드 코어 제품들도 속속 등장하고 있으니, 슬슬 멀티코어 프로그래밍을 본격적으로 준비해야 할것 같네요.
모두 함께 병렬 컴퓨팅의 상쾌함을 느껴보시죠~~  

즐거운 어린이날 되소서!

이름아이콘 들풀
2012-05-04 13:47
어린이날이군요..~ㅎㅎ
   
이름아이콘 날아라현
2012-05-07 10:34
흥미로운 주제입니다.
감사합니다.  :)
   
이름아이콘 소오강호
2012-05-07 16:48
매우 시기 적절한 포스팅이네요. 어플 측면에서의 접근도 흥미롭지만, 프레임워크단에서 성능과 전력 소모의 관점에서 본 멀티 코어 관리역시 매우 재미난 주제가 될 수 있겠습니다.
   
이름아이콘 다이나믹링크
2012-05-08 14:09
커널에서는 IRQ handler를 여러 코어에 분산시키고 로드 밸런싱하는 아랫단 부분부터, GUI 관련 2D/3D 가속부분까지 다양한 연구 응용 분야가 있을것 같네요.  단, 모바일 플랫폼의 특성상 당장 사용하지 않는 코어는 꺼놓은것이 적력소모를 줄이는 일반적 구성이므로, 실제 플랫폼에 병렬 컴퓨팅을 적용하는것은 또 다른 과제가 아닐까 생각하고 있습니다.
   
 
덧글 쓰기 0
3500
※ 회원등급 레벨 0 이상 읽기가 가능한 게시판입니다.
    N     분류     제목    글쓴이 작성일 조회
150 스탠포드대학의 Systrace와 Power 정보 결합 내용 [1] Jaynux 2016-03-29 4830
149 누리펫, 페이스북 연동 + 애견 자동 급식기 프로젝트, 소스 및.. 아이시클 2014-11-20 3206
148 11월 등록 프로모션 진행! [W3C 온라인 트레이닝 한국어 서비.. 미래웹기술연구소 2013-11-01 2877
147 무료통화 mVoIP API - 예제 소스 포함 뭉치v 2013-04-29 5316
146 이파일에 대한소스좀 gongdol11 2012-09-03 4435
145 쇼핑몰 앱 소스 공개합니다.(Android, iOS) 씨트린매니저 2012-06-12 7380
144 Multicore向 Unified KToolChain ver2.6 (20130105) [14]+22 인베인 2012-05-16 10837
143 [오픈소스] 애주가 소스 공개 아아베재더라아 2012-05-09 5768
142 OpenMP를 이용한 멀티코어 프로그래밍 [4] 다이나믹링크 2012-05-04 6594
141 안드로이드 서비스에 기능 추가 하기 [2] 레이지보이 2012-02-24 5665
140 HTML as App #4 - 기본 링크 스타일과 선택 동작 없애기.. [1]+1 비즈페이 2011-12-30 8201
139 HTML as App #3 - HTML 시작 비즈페이 2011-12-30 5226
138 HTML as App #2 - 주의해야 할 것! 비즈페이 2011-12-27 4072
137 HTML as App #1 - 들어가기 전에 [1]+1 비즈페이 2011-12-22 5080
136 NPTL Optimization for Lightweight Embedded Devices [3]+2 들풀 2011-06-25 5398
135 안드로이드 APK소스의 법적 공개 의무 [5]+7 인베인 2011-03-27 8047
12345678910