참고. NDS 속도에 대한 몇가지 테스트
원문 : http://kkamagui.springnote.com/pages/503175
들어가기 전에...
- 이 글은 kkamagui에 의해 작성된 글입니다.
- 마음껏 인용하시거나 사용하셔도 됩니다. 단 출처(http://kkamagui.tistory.com, http://kkamagui.springnote.com)는 밝혀 주십시오.
- 기타 사항은 mint64os at gmail.com 이나 http://kkamagui.tistory.com으로 보내주시면 반영하겠습니다.
- OS 제작에 대한 상세한 내용은 책 "64비트 멀티코어 OS 구조와 원리"를 참고하기 바랍니다.
0.시작하면서...
NDS의 실제 속도는 얼마나 될까? 클럭으로 따지자면 둘다 100MHz가 안되니 그리 빠르다고는 할 수 없다. 하지만 이 수치만 가지고는 뭔가 와닿지가 않는다.
우리가 쉽게 느낄 수 있는 것? 화면 그리는데 몇 ms 걸리고, 얼마의 크기의 메모리를 복사하는데 몇 ms가 걸리고 하는 말이 더 와닿지 않는가? 지금부터 프로파일러를 사용해서 NDS의 속도에 대한 몇가지를 테스트 해보자. 프로파일러에 대한 내용은 22 타이머(Timer)를 이용한 프로파일러(Profiler) 만들기 에서 찾을 수 있다.
1.메모리 복사 속도
메모리 속도 테스트는 RGB555 포맷을 사용하는 프레임 버퍼(Frame Buffer)모드의 화면 전체를 복사하는 것을 테스트 했다. 참고로 스크린의 크기는 256 * 192 이므로 총 메모리양은 256 * 192 * 2 = 98304 Byte이다.
여기서 사용된 코드는 모두 GCC의 최적화 옵션 중 최고인 -O2 옵션으로 컴파일 되고 링크되었다.
1.1 메인 메모리(Main Memory) -> 메인 메모리(Main Memory)
1.1.1 memcpy 사용
아래는 프로파일링 테스트에 사용된 함수이다.
- /**
FrameBuffer의 내용을 LCD에 덤프한다.
*/
void CWindowManager::DumpFrameBufferToScreen( void )
{
memcpy( SUB_FRAMEBUFFER, MAIN_FRAMEBUFFER, SCREEN_HEIGHT * SCREEN_WIDTH * 2 ); - memcpy( MAIN_FRAMEBUFFER, SUB_FRAMEBUFFER, SCREEN_HEIGHT * SCREEN_WIDTH * 2 );
}
테스트 결과는 아래와 같다.
- NDS : 17 ~ 18 ms,한 화면을 복사하는데 8.5 ~ 9 ms
- NDS Emulator(iDeaS) : 23 ~ 24 ms,한 화면을 복사하는데 11.5 ~ 12 ms
1.1.2 for 루프 사용
아래는 프로파일링 테스트에 사용된 함수이다.
- /**
FrameBuffer의 내용을 LCD에 덤프한다.
*/
void CWindowManager::DumpFrameBufferToScreen( void )
{
int i;
DWORD* pdwDst;
DWORD* pdwSrc;
pdwDst = ( DWORD* ) SUB_FRAMEBUFFER;
pdwSrc = ( DWORD* ) MAIN_FRAMEBUFFER;
for( i = SCREEN_HEIGHT * SCREEN_WIDTH / 2 ; i > 0 ; i-- )
{
*pdwDst = *pdwSrc;
pdwDst++;
pdwSrc++;
}
pdwDst = ( DWORD* ) MAIN_FRAMEBUFFER;
pdwSrc = ( DWORD* ) SUB_FRAMEBUFFER;
for( i = SCREEN_HEIGHT * SCREEN_WIDTH / 2 ; i > 0 ; i-- )
{
*pdwDst = *pdwSrc;
pdwDst++;
pdwSrc++;
}
}
테스트 결과는 아래와 같다.
- NDS : 17 ~ 18 ms,한 화면을 복사하는데 8.5 ~ 9 ms
- NDS Emulator(iDeaS) : 29 ~ 30 ms,한 화면을 복사하는데 14.5 ~ 15 ms
1.1.3 고속 메모리 전송 함수 사용(자작)
ARM 모드의 12개 레지스터를 사용해서 블럭 전송을 하는 소스코드인데, 자세한 것은 02 NDS 홈브루(Homebrew) - NDS 윈도우 시스템(Windows System)의 내용을 참고하자. 시간은 4 ~ 5 ms 정도(앞서 테스트의 반) 나온다.
1.2 메인 메모리(Main Memory) -> 비디오 메모리(Video Memory)
1.2.1 memcpy 사용
아래는 프로파일링 테스트에 사용된 함수이다.
- /**
FrameBuffer의 내용을 LCD에 덤프한다.
*/
void CWindowManager::DumpFrameBufferToScreen( void )
{
memcpy( LCD_MAIN_ADDR, MAIN_FRAMEBUFFER, SCREEN_HEIGHT * SCREEN_WIDTH *
2 );
memcpy( LCD_SUB_ADDR, SUB_FRAMEBUFFER, SCREEN_HEIGHT * SCREEN_WIDTH *
2 );
}
테스트 결과는 아래와 같다.
- NDS : 14 ~ 15 ms,한 화면을 복사하는데 7 ~ 7.5 ms
- NDS Emulator(iDeaS) : 23 ~ 24 ms,한 화면을 복사하는데 11.5 ~ 12 ms
1.2.2 For 루프 사용
아래는 프로파일링 테스트에 사용된 함수이다.
- /**
FrameBuffer의 내용을 LCD에 덤프한다.
*/
void CWindowManager::DumpFrameBufferToScreen( void )
{
int i;
DWORD* pdwDst;
DWORD* pdwSrc;
pdwDst = ( DWORD* ) LCD_MAIN_ADDR;
pdwSrc = ( DWORD* ) MAIN_FRAMEBUFFER;
for( i = SCREEN_HEIGHT * SCREEN_WIDTH / 2 ; i > 0 ; i-- )
{
*pdwDst = *pdwSrc;
pdwDst++;
pdwSrc++;
}
pdwDst = ( DWORD* ) LCD_SUB_ADDR;
pdwSrc = ( DWORD* ) SUB_FRAMEBUFFER;
for( i = SCREEN_HEIGHT * SCREEN_WIDTH / 2 ; i > 0 ; i-- )
{
*pdwDst = *pdwSrc;
pdwDst++;
pdwSrc++;
}
}
테스트 결과는 아래와 같다.
- NDS : 16 ~ 17 ms,한 화면을 복사하는데 8 ~ 8.5 ms
- NDS Emulator(iDeaS) : 29 ~ 30 ms,한 화면을 복사하는데 14.5 ~ 15 ms
1.2.3 고속 메모리 함수 사용(자작)
여기 추가하기...
1.3 비디오 메모리(Video Memory) -> 메인 메모리(Main Memory)
1.3.1 memcpy 사용
아래는 프로파일링 테스트에 사용된 함수이다.
- /**
FrameBuffer의 내용을 LCD에 덤프한다.
*/
void CWindowManager::DumpFrameBufferToScreen( void )
{
memcpy( MAIN_FRAMEBUFFER, LCD_MAIN_ADDR, SCREEN_HEIGHT * SCREEN_WIDTH *
2 );
memcpy( SUB_FRAMEBUFFER, LCD_SUB_ADDR, SCREEN_HEIGHT * SCREEN_WIDTH *
2 );
}
테스트 결과는 아래와 같다.
- NDS : 13 ~ 14 ms,한 화면을 복사하는데 6.5 ~ 7 ms
- NDS Emulator(iDeaS) : 23 ~ 24 ms,한 화면을 복사하는데 11.5 ~ 12 ms
1.3.2 For 루프 사용
아래는 프로파일링 테스트에 사용된 함수이다.
- /**
FrameBuffer의 내용을 LCD에 덤프한다.
*/
void CWindowManager::DumpFrameBufferToScreen( void )
{
int i;
DWORD* pdwDst;
DWORD* pdwSrc;
pdwDst = ( DWORD* ) MAIN_FRAMEBUFFER;
pdwSrc = ( DWORD* ) LCD_MAIN_ADDR;
for( i = SCREEN_HEIGHT * SCREEN_WIDTH / 2 ; i > 0 ; i-- )
{
*pdwDst = *pdwSrc;
pdwDst++;
pdwSrc++;
}
pdwDst = ( DWORD* ) SUB_FRAMEBUFFER;
pdwSrc = ( DWORD* ) LCD_SUB_ADDR;
for( i = SCREEN_HEIGHT * SCREEN_WIDTH / 2 ; i > 0 ; i-- )
{
*pdwDst = *pdwSrc;
pdwDst++;
pdwSrc++;
}
}
테스트 결과는 아래와 같다.
- NDS : 16 ~ 17 ms,한 화면을 복사하는데 8 ~ 8.5 ms
- NDS Emulator(iDeaS) : 29 ~ 30 ms,한 화면을 복사하는데 14.5 ~ 15 ms
1.3.3 고속 메모리 전송 함수(자작)
여기 추가하기...
1.4 비디오 메모리(Video Memory) -> 비디오 메모리(Video Memory)
1.4.1 memcpy 사용
아래는 프로파일링 테스트에 사용된 함수이다.
- /**
FrameBuffer의 내용을 LCD에 덤프한다.
*/
void CWindowManager::DumpFrameBufferToScreen( void )
{
memcpy( LCD_SUB_ADDR, LCD_MAIN_ADDR, SCREEN_HEIGHT * SCREEN_WIDTH *
2 );
memcpy( LCD_MAIN_ADDR, LCD_SUB_ADDR, SCREEN_HEIGHT * SCREEN_WIDTH *
2 );
}
테스트 결과는 아래와 같다.
- NDS : 16 ~ 17 ms,한 화면을 복사하는데 8 ~ 8.5 ms
- NDS Emulator(iDeaS) : 23 ~ 24 ms,한 화면을 복사하는데 11.5 ~ 12 ms
1.4.2 For 루프 사용
아래는 프로파일링 테스트에 사용된 함수이다.
- /**
FrameBuffer의 내용을 LCD에 덤프한다.
*/
void CWindowManager::DumpFrameBufferToScreen( void )
{
int i;
DWORD* pdwDst;
DWORD* pdwSrc;
pdwDst = ( DWORD* ) LCD_SUB_ADDR;
pdwSrc = ( DWORD* ) LCD_MAIN_ADDR;
for( i = SCREEN_HEIGHT * SCREEN_WIDTH / 2 ; i > 0 ; i-- )
{
*pdwDst = *pdwSrc;
pdwDst++;
pdwSrc++;
}
pdwDst = ( DWORD* ) LCD_MAIN_ADDR;
pdwSrc = ( DWORD* ) LCD_SUB_ADDR;
for( i = SCREEN_HEIGHT * SCREEN_WIDTH / 2 ; i > 0 ; i-- )
{
*pdwDst = *pdwSrc;
pdwDst++;
pdwSrc++;
}
}
테스트 결과는 아래와 같다.
- NDS : 19 ~ 20 ms,한 화면을 복사하는데 9.5 ~ 10 ms
- NDS Emulator(iDeaS) : 39 ~ 40 ms,한 화면을 복사하는데 19.5 ~ 20 ms
1.4.3 고속 메모리 전송 함수(자작)
ARM 모드의 12개 레지스터를 사용해서 블럭 전송을 하는 소스코드인데, 자세한 것은 02 NDS 홈브루(Homebrew) - NDS 윈도우 시스템(Windows System)의 내용을 참고하자. 시간은 4 ~ 5 ms 정도(앞서 테스트의 반) 나온다.
1.5 메모리 복사에 대한 결론
- 비디오 메모리 -> 비디오 메모리를 제외하고는 모두 거의 비슷
- 블럭 전송 시간 < memcpy 시간 <= for 루프 시간
- 에뮬레이터의 속도는 믿을 것이 못됨
- 블럭 전송이 가장 빠름
이 글은 스프링노트에서 작성되었습니다.
'NDS 홈브루(Homebrew) > 홈브루 Tutorial' 카테고리의 다른 글
참고. THUMB 코드와 ARM 코드 및 상호 호출(Interworking) (0) | 2007.11.14 |
---|---|
참고. Software Reset 방법 (0) | 2007.11.14 |
참고. DPG 파일 포맷 (0) | 2007.11.14 |
참고. ARM 어셈블리(Assembly) (0) | 2007.11.14 |
참고. ARM Processor Overview (0) | 2007.11.14 |