이 문서를 읽는 중입니다. 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()과 같은 리눅스 메소드가 사용되지 않았다면 가상 연속 메모리가 아닐까?
* 참고 : 작성자는 제공되는 코드가 의사 코드임을 지정하므로 구현시의 난제가 근거없는 것일 수 있습니다.
"원래 버퍼"란 무엇입니까? 선언 된 배열'a','b' 및'index'를 의미합니까? – usr2564301
코드에 더 많은 내용이있을 수 있습니다. 코드는 의사 코드가 아니며 실제 C입니다. 연속 보장의 핵심은 * arrays *가 사용된다는 것입니다. 배열 (* 유형에 대한 포인터에 대한 * 포인터와 반대)은 모든 요소에 대한 순차적 메모리 위치를 보장합니다. 인접 메모리 액세스 코드에서 연속적인 요소 인 * in-order *를 반복하면됩니다. 여기서 인접하지 않은 예제는 배열에서 임의의 인덱스를 반복합니다. –
@ DavidC.Rankin. 그들? 포인터를 사용하여 가상 메모리의 위치를 반복하는 C 반복기 연산을 사용할 수 있기 때문에 가상 메모리에서 연속적으로 연결됩니다. 메모리의 가상 메모리 위치의 물리적 값에 대해서도 마찬가지입니까? IE를 만들 때 컴파일러는 연속적인 물리적 위치를 가진 가상 메모리 맵에서 일련의 위치를 선택합니까? –