AGP메모리


물음들 : 로컬(비디오) 메모리는 쓰기 속도가 느려서 잦은 갱신에는 적합하지 않고, 시스템 메모리는 그래픽카드쪽에서 읽는게 느려서 문제입니다. 그걸 해결하기 위한게 AGP메모리입니다.


꼭 그렇지는 않습니다. 사실 로컬(비디오) 메모리로 데이터의 Burst 전송이 AGP를 통해 필요할때마다 께작께작 가져가는 데이터보다 더 효율적이리라 추측하고 있습니다. 일단 같은 AGP를 통해 전송되고 한번에 많은 데이터를 보낼경우 주소나 정보를 Burst 해서 보낼 수 있으니까요. 그렇지만 한번 쓰고 버릴 Dynamic 데이터들을 비디오 카드로 전송해서 복사본을 만든다음 쓰는 것이 비효율적이기 때문에 AGP메모리가 사용됩니다. 


참고로 시스템 메모리는 그래픽 카드에서 바로 접근이 불가능합니다. 대부분 H/W들이 그렇지만 I/O 버스와 메모리 버스가 100% 맵핑되는 경우가 없고 데이터 전송에는 DMA에 그외 비슷한 특별한 조치가 필요한 것이죠. AGP 메모리가 그런 특별한 조치중 한가지로 시스템에서 허용한 메모리에 대해 CPU의 도움 없이 그래픽 카드가 멋대로(임의로?) 데이터를 읽어올 수 있는 획기적인(은 아닌것 같지만) 구성입니다. 시스템 메모리의 데이터를 특별한 방법을 사용하지 않고 그래픽 카드로 전송하려면 CPU의 보조가 필수적입니다. 


물음들 : AGP메모리는 일반 램에 영역을 잡아주는 것으로, CPU에서 쓰기속도와 그래픽카드쪽에서 읽기 속도(로컬 메모리보단 약간 느립니다.)가 빠릅니다. 대신 CPU에서 읽기속도는 느리므로 읽는 처리시에는 시스템 메모리가 좋겠지요.


하드웨어에 따라 다르지만 AGP 메모리보다 로컬(비디오) 메모리가 '매우' 빠릅니다. AGP 2X가 533MB/s 정도이고 8X가 대략 2GB/s 정도인데 GeForce 6800 Ultra 의 경우(사악한 비교대상입니다.) 33.6GB/s 의 내부 전송률을 갖고 있습니다. 뭐 하급 기종으로 가면서 절반, 또 절반씩 깍이는 속도이긴 하지만 절반이라 하더라도 AGP 8X의 무려 8배에 달하는 속도를 갖고 있습니다. 게다가!!! AGP 메모리는 시스템 메모리이기 때문에 CPU의 작업률이 올라가면 덩달아 AGP의 효율도 떨어지게 됩니다. 


그리고 AGP 메모리는 캐쉬가 되지 않는 메모리입니다. 간단히 말해서 CPU 캐쉬가 작동하지 않고 작은 메모리 단위로 여러번 읽어올 경우(C/C++코드를 생각하면 곤란하고 어셈 코드단위로 생각하세요.) 캐쉬가 작동하지 않기 때문에 물리적(전기적)으로 메모리에 여러번 접근을 하게 됩니다. 캐쉬를 쓰고 있을때는 크게 느껴지지 않지만 물리적인 메모리에서 데이터를 가져오는 시간은 수십 클럭 이상이 걸리기 때문에 4바이트 또는 12바이트 단위로 데이터에 접근할 경우 4바이트당 수십 클럭을 소모하게 됩니다. PCI도 크게 다르지 않은데 DDraw를 쓰면서 Surface 데이터를 바로 읽어서 알파 블렌딩을 해보신 분들은 무슨 뜻인지 금방 이해 하시리라 생각됩니다.


(메모리 구입시 4-4-4-12 같은 숫자가 바로 이 접근시 걸리는 시간입니다. 최악의 경우 '전부 더한다'정도의 메모리 클럭을 먹는다고 생각하시면 됩니다. CPU는 메모리 버스 클럭의 수배에서 수십배의 속도를 갖고 있으니 최악의 경우 4바이트 접근에 수백 CPU 클럭이 사용될 수도 있습니다.) 


p.s.AGP로 데이터 쓰기 작업에는 WC 버퍼라고 하는 녀석이 쓰여서 쓰기 속도 저하를 상당히 막아주고 있죠. 작은 쓰기 전용 캐쉬 같은거죠.

Posted by JJOREG

다음의 코드를 보자



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <iostream>
 
int main (void)
{
 
 const int b = 100;
 
 printf("%d\n", b);
 
 int* temp = const_cast<int*>(&b);
 
 *temp = 200;
 
 int* temp2 = temp;
 
 printf("%d\n", b);
 printf("%d\n", *temp);
 printf("%d\n", *temp2);
 
 int* temp3 = const_cast<int*>(&b);
 
 printf("%d\n", *temp3);
 
    return 0;
 
}

const_cast는 참조형의 const나 휘발성을 제거해주는 캐스트방식이다. 즉 위의 const int b는 값형이므로 언뜻보면 캐스트가 안될 수 있지만.
실제 출력되는 값은 temp2의 값이 200으로 변환되어서 컴파일까지 잘 된다.
이게 왜 되는 것인가? const int b의 값을 바꾸는게 되는것인가?
이유는 컴파일러에 있다고 본다. const int b라고 되어있는 부분은 컴파일 시점에서 const int b가 되는 것이 아니라. 100으로 치환되기 때문에 값의 변경과 상관 없이 100의 상수값으로 변경된 것이고 그렇기 때문에 후에 변경하는 값은 b의 값을 아무리 출력해도 100이라는 상수값으로 대체되었기 때문에 100으로 출력되는 것으로 보인다.


Posted by JJOREG

00 BLOG http://jjoreg.tistory.com/


01 WINAPI http://www.youtube.com/watch?v=48WA4mBJt6M


02 DIRECTX2D http://www.youtube.com/watch?v=PvBCWlV7Jj4


03 DIRECTX2D MFCTOOL http://www.youtube.com/watch?v=z7BMUlP0f-o


04 DIRECTX2.5D http://www.youtube.com/watch?v=48WA4mBJt6M


05 DIRECTX2.5D MFCTOOL http://www.youtube.com/watch?v=yB_k0chW_GA


06 DIRECTX3D http://www.youtube.com/watch?v=OuHRamHwniA

Posted by JJOREG