회원 및 비회원 모두 열람이 가능합니다. 최대 업로드 가능한 용량은 20MB 입니다.
iMx51에서 wince로 개발을 진행하고 있는데 역시나 극악의 성능을 보여 줍니다.
간단하게 테스트 겸해서 우분투와 비교 테스트를 했더니 6배에서 2배 까지 속도를 보여 줍니다.
코드는 귀찮아서 간단하게
Linux
#include <sys/time.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <math.h>
int main(int argc, char *argv[])
{
volatile unsigned int i;
double a;
// unsigned int start_time = 0, end_time = 0;
struct timeval start_time, end_time;
gettimeofday(&start_time, NULL);
for(i = 0 ; i < 1000000; ++i)
{
a = cos(i) * 0.7254 * tan(i);
}
gettimeofday(&end_time, NULL);
printf("start time [%ld,%06ld], end time [%ld,%06ld], elapsed time [%ld]n",
start_time.tv_sec, start_time.tv_usec, end_time.tv_sec, end_time.tv_usec,
(end_time.tv_sec * 1000 + end_time.tv_usec / 1000) -
(start_time.tv_sec * 1000 + start_time.tv_usec / 1000) );
printf("result : %fn", a);
return 0;
}
wince
#include "stdafx.h"
#include <windows.h>
#include <commctrl.h>
int _tmain(int argc, _TCHAR* argv[])
{
volatile unsigned int i;
double a;
unsigned int start_time = 0, end_time = 0;
start_time = GetTickCount();
for(i = 0 ; i < 1000000; ++i)
{
a = cos(i) * 0.7254 * tan(i);
}
end_time = GetTickCount();
printf("start time [%u], end time [%u], elapsed time [%u]n",
start_time, end_time, end_time - start_time);
printf("result : %fn", a);
return 0;
}
위의 코드로 돌려 봤습니다. 어차피 여러번 돌리나 한번 돌리나 결과 값은 10% 내외에서 변동 하니 평균은 구하지 않았습니다.
arm-linux-gcc -mthumb -mthumb-interwork -march=armv4t -lm -o vfp_test_thumb vfp_test.c
arm-linux-gcc -mfloat-abi=softfp -mfpu=neon -mcpu=cortex-a8 -lm -ftree-vectorize -o vfp_test_vector vfp_test.c
arm-linux-gcc -mfloat-abi=softfp -mfpu=neon -mcpu=cortex-a8 -lm -o vfp_test_neon vfp_test.c
arm-linux-gcc -mfloat-abi=softfp -mfpu=vfp3 -mcpu=cortex-a8 -lm -o vfp_test_vfp3 vfp_test.c
ubuntu@ubuntu-desktop:~/test$ ./vfp_test_thumb
start time [353769,566308], end time [353775,113272], elapsed time [5547]
result : -0.708971
ubuntu@ubuntu-desktop:~/test$ ./vfp_test_vfp3
start time [353786,328435], end time [353789,114197], elapsed time [2786]
result : -0.708971
ubuntu@ubuntu-desktop:~/test$ ./vfp_test_neon
start time [353805,918641], end time [353808,616771], elapsed time [2698]
result : -0.708971
ubuntu@ubuntu-desktop:~/test$ ./vfp_test_vector
start time [353815,188671], end time [353817,886207], elapsed time [2698]
result : -0.708971
wince 결과 값
==========================================================================
========= wince ================================
==========================================================================
start time [95348], end time [111216], elapsed time [15868]
result : -0.708971
==========================================================================
========= wince (VFP) ================================
==========================================================================
start time [138636], end time [144177], elapsed time [5541]
result : -0.708971
wince 로 하자는 걸 강력 하게 만류 하지 못 한걸 후회 중입니다. ㅠ.ㅠ
map 파일을 만들어 확인 해 보면, CE6에서 사칙 연산과 수학 함수는 fpcrt.dll에 있는 함수들을 import 해서 씁니다. fpcrt.dll은 arm에서 제공해주는 건제 vfpv2 까지 지원이 되는 것으로 알고 있습니다. fpcrt.dll을 썼을때 리눅스의 1/2 속도로 근접 했습니다. CE7 컴파일러로 neon 을 사용할 수 있다고는 하는데 vectorize function을 어떻게 만들어야 하는 건지 당췌 알 수 없으니 일단 제껴 놓구 있습니다.
Linux COFF <-> PE Interworking이 가능 하다면 그냥 속편하게 RVCT 를 사서 쓸 용의도 있습니다만, 그건 일단 돌아 가는 걸 보고 판단 해야 겠네요.
WinCE에서 sources에
WINCECOD=1
로 어셈 리스팅 파일을 추출한것과 리눅스에서 어셈 나온걸 비교해보면
적어도 프로그램 자체에 대해서는 비교해 볼 수 있을 것 같고요.
좀더 나아가서는 수학함수 라이브러리들을 디어셈 해서 비교해보면 바로 답나올 것 같습니다.
CE7컴파일러로 리스팅 추출해보니 적어도 VFP명령은 쓰고 있었고요.
아직 안써봤지만, NEON은 따로 intrinsic함수가 있을 것으로 보이고
WinCE5부터도 L2캐쉬는 BSP에서 지원하면 쓸 수 있는데(L2 Cache Management는 좀 그렇고요),
Freescale칩에서 BSP내에 지원코드를 넣어놓지 않은 것 같습니다.
Linux COFF <-> PE Interworking은 CE6에서는 EABI지원이 안되서 ARMv7용은 힘들 것 같고, CE7이라면, 가능성은 있어보입니다.
반전이 있었으면 저도 좋겠습니다.
우선 wince 에서는 cortex-a8의 L2 캐쉬가 지원이 되지 않는 것으로 알고 있습니다. freescale의 bsp에서는 L2 캐쉬가 있지만 mobile 툴로 살펴 보면 사용 하지 않음 으로 나옵니다.
wince에서 DVFS는 현재 로딩 되지 않고, CPU는 파이볼 수준으로 뜨겁습니다. cegcc로 빌드 해서 돌려 봤을 때에는 vs나 별반 차이가 없습니다. gcc로 static 빌드를 한다는 말씀은 리눅스에서 빌드 해보라는 말씀이신지? elf 포맷을 pe 포맷으로 변환이 가능 한가요?
의문이 가는건 SDRAM 데이터 버스가 32비트 라인으로 되어 있는 건데 thumb 머쉰에서 32비트 데이터 라인을 어떻게 access가 가능 한지 의문 입니다.
잘은 모르겠지만 thumb 로 컴파일되는 부분들이 있서서 그런걸까요?