2017-12-16 16 views
3

이 문서를 읽는 중입니다. http://www.ece.cmu.edu/~ece447/s13/lib/exe/fetch.php?media=moscibroda.pdfC 및 메모리 액세스 대기 시간의 연속 메모리 할당

여기에는 다중 코어가있는 대부분의 아키텍처에 사용되는 메모리 액세스의 현재 방법이 설명되어 있습니다. 이 논문은 동시 스레드를 처리 할 때 현재 방법의 제한 사항에 대한 예제를 제공합니다. 여기서 연속적 인 순차적 인 명령어와 순차적 인 명령어의 다른 불연속 메모리 위치에서 메모리를 액세스합니다.

순차 명령어에서 연속 메모리에 액세스하는 페이퍼 스레드는 메모리 컨트롤러에서 먼저 처리합니다. 확실히 의심의 여지가 없지만 저자는 인접한 메모리가 순차적으로 액세스되는 응용 프로그램과 인접한 메모리가 순차적으로 액세스되지 않는 응용 프로그램을 설명하기 위해 두 가지 코드를 제공합니다. 여기에 코드가 있습니다.

연속 메모리 액세스

// initialize arrays a, b 
for (j=0; j<N; j++) 
    a[index[j]] = b[index[j]]; 
for (j=0; j<N; j++) 
    index[j] = j; // streaming index 
for (j=0; j<N; j++) 
     b[index[j]] = scalar * a[index[j]]; 

비 연속적인 메모리 액세스

// initialize arrays a, b 
for (j=0; j<N; j++) 
    index[j] = rand(); // random # in [0,N] 
for (j=0; j<N; j++) 
    a[index[j]] = b[index[j]]; 
for (j=0; j<N; j++) 
    b[index[j]] = scalar * a[index[j]]; 

내 질문 당신은 다음에 실행, C에서이 코드를 구현하고 x86 또는 ARM에 대해 컴파일한다면 어떤 운영체제에서는 리눅스가 할당하고있는 원래 버퍼의 메모리 위치가 물리적으로 연속적이라는 보장이 있습니까? kmalloc()과 같은 리눅스 메소드가 사용되지 않았다면 가상 연속 메모리가 아닐까?

* 참고 : 작성자는 제공되는 코드가 의사 코드임을 지정하므로 구현시의 난제가 근거없는 것일 수 있습니다.

+0

"원래 버퍼"란 무엇입니까? 선언 된 배열'a','b' 및'index'를 의미합니까? – usr2564301

+2

코드에 더 많은 내용이있을 수 있습니다. 코드는 의사 코드가 아니며 실제 C입니다. 연속 보장의 핵심은 * arrays *가 사용된다는 것입니다. 배열 (* 유형에 대한 포인터에 대한 * 포인터와 반대)은 모든 요소에 대한 순차적 메모리 위치를 보장합니다. 인접 메모리 액세스 코드에서 연속적인 요소 인 * in-order *를 반복하면됩니다. 여기서 인접하지 않은 예제는 배열에서 임의의 인덱스를 반복합니다. –

+1

@ DavidC.Rankin. 그들? 포인터를 사용하여 가상 메모리의 위치를 ​​반복하는 C 반복기 연산을 사용할 수 있기 때문에 가상 메모리에서 연속적으로 연결됩니다. 메모리의 가상 메모리 위치의 물리적 값에 대해서도 마찬가지입니까? IE를 만들 때 컴파일러는 연속적인 물리적 위치를 가진 가상 메모리 맵에서 일련의 위치를 ​​선택합니까? –

답변

0

내 질문은 당신이 당신이 어떤 보장을 할 것이다, 리눅스 말, C에서이 코드를 구현하고 x86 또는 ARM에 대한 를 컴파일 한 후 일부 운영 체제에서 실행한다면 그의 메모리 위치 원래 할당 할 버퍼가 물리적으로 연속적입니까?

않음 :

코드는 의사 코드받지 못하면 (0-(N-1)에서 rand()의 복귀를 제한 할 필요 만 % N 누락 모듈러 연산자) 실제 C이다. 연속 보장의 핵심은 배열이 사용된다는 것입니다. C 배열 (포인터가 포인터와 반대). 이는 가상 메모리의 모든 요소에 대한 순차적 메모리 위치를 보장합니다 (일반적으로 현대 메모리 관리자가 제공하는 유일한 종류의 메모리 임).

인접 메모리 액세스 코드에서 인접한 요소 을 순차적으로 반복하면인데 연속되지 않는 예제는 배열에서 임의의 인덱스를 반복합니다. (인접 요소를 보장하지 않는 객체의 컬렉션을 메모리에 순차적 것이다 많은 경우가 있기 때문에

당신의 당황은 근거가 아니라, 저자는 모든 요소가 순차적 보장의 예에서 배열의 사용을 지정 정의에 의해).

비 연속 예

액세스가 (이 아니라 구문의 % N 누락 된 이후에 의사입니다) rand()를 사용하여 비 연속되어 (예 index[j] = rand() % N;0-N에 할당을 제한하지만 것 모든 색인이 보장되지는 않음) 예를 들어, 연속 된 블록 내에서 직접 순차 액세스를 강조하는 것이 었습니다. 연속되지 않은 예는 단순히 contra-example으로 제공되었습니다. 순차적 블록.

+0

"가상 메모리의 모든 요소에 대한 순차적 메모리 위치를 보장합니다."- 그렇지만 메모리 대기 시간과 관련하여 최상의 성능을 위해 프로그램을 최적화하려는 경우 중요한 가상 주소 공간 연속성 - 주소 - 공간 - 연속성? 주어진 (AFAIK) RAM 모듈은 페이지 테이블과 같은 OS 레벨 구조에 대한 지식이 없기 때문에 후자라고 생각합니다. –

+0

전적으로 하드웨어에 대한 대답을 정하기 위해 박사 학위 수준의 논문이 필요합니다 (저는 하드웨어 또는 메모리 관리자가 있다고 주장하지 않습니다, 법률은 그렇습니다) 나는 그것이 중요한 측면이라고 생각합니다. (그리고 내가 말한다면) 메모리 관리자는 물리적 주소 공간의 비 연속적인 부분을 묶어서 연속적인 가상 주소 블록으로 프로그램에 제공 할 정도로 똑똑하다. 나는 프로그램이 알거나 돌보는 길. 그건 내 의심이다. –

+0

Yeah @ DavidC.Rankin 여기에 누락 된 하드웨어 측면은 OS와 하드웨어 아키텍처에 따라 다르기 때문에 말하기가 어렵다고 생각합니다. @ JeremyFriesner의 요점은 가상 주소 공간이 실제 RAM 위치에 매핑되는 방법에 관한 것입니다. 저자는 하드웨어의 실제 메모리 액세스 패턴과 관련이있었습니다. 제 관심사는 그가 쓴 첫 번째 C 코드가 연속 가상 메모리 액세스가 RAM 컨트롤러에 의한 연속적인 실제 메모리 액세스와 일치한다는 것을 보증하지 않는다는 것입니다. –