2008-09-16 2 views
3

하드 실시간 제약 조건이있는 임베디드 응용 프로그램 (32 비트 프로세서의 C로 작성)에서 중요한 코드 (특히 인터럽트)의 실행 시간은 일정해야합니다.캐시로 인해 실행 시간에 변동이없는 코드를 어떻게 실행할 수 있습니까?

코드의 실행시 이 도입되지 않았는지, 특히 프로세서의 캐시 (L1, L2 또는 L3 일 수 있음) 때문에 시간 변동성이 발생하지 않도록하려면 어떻게해야합니까?

효과가 실행 속도 (때로는 100 : 1 대 액세스 RAM보다 높음)로 인한 캐시 동작과 관련이 있습니다. 특정 프로세서 아키텍처로 인한 가변성은 캐시의 크기와 비슷합니다.

답변

2

하드웨어를 사용하거나 할 수있는 사람과 함께 작업 할 수있는 경우 캐시를 끌 수 있습니다. 일부 CPU에는 전원이 아닌 접지로 연결된 경우 (또는 다른 방법으로) 모든 내부 캐시가 비활성화되는 핀이 있습니다. 예측 성은 있지만 속도는 떨어질 것입니다!

소프트웨어 코드의 특정 위치에서 의도적으로 캐시를 정크로 채우도록 작성 될 수 있으므로 다음에 발생하는 모든 사항이 캐시 미스로 보장 될 수 있습니다. 올바르게 수행하면 예측 가능성을 제공 할 수 있으며 특정 위치에서만 수행 할 수 있으므로 캐시를 완전히 사용 불가능하게 설정하는 것보다 속도가 더 좋을 수 있습니다.

마지막으로, 속도가 중요하다면 - 소프트웨어와 데이터를 고대 8 비트 CPU 프로그래밍의 경우처럼 신중하게 설계하십시오. L1 캐시에 맞게 충분히 작게 유지하십시오. 요즘의 온보드 캐시가 미니 컴퓨터의 모든 RAM보다 더 큰지는 항상 놀랍습니다. 그러나 이것은 열심히 일하고 영리함을 취할 것입니다. 행운을 빕니다!

2

두 가지 가능성 :

캐시를 완전히 비활성화하십시오. 응용 프로그램은 더 느리게 실행되지만 가변성은 없습니다.

캐시에 코드를 미리로드하고 "잠급니다". 대부분의 프로세서는이를위한 메커니즘을 제공합니다.

-1

메모리를 미리 할당하고 인터럽트가 캐시에 영향을 미치지 않는지 확인하십시오 (불가능, 올바르게).

/앨런

2
당신이 마음에 실시간 시스템에 내장되지 않은 x86 프로세서 제품군 언급하는 것 같다, 그래서 일정 시간 실행을위한 실제 보장 (CPU 마이크로 명령의 순서를 변경 할 수 없다

, CPU가 잘못하여 조건부 점프를 예측할 때마다 플러시되는 분기 예측 및 명령 프리 페치 대기열이 있습니다 ...)

-1

복잡한 연산 및 타이머를 사용할 때 최악의 런타임을 이해합니다.

0

이 답변은 악의에 찬 소리가 있지만 당신이 생각하게하기위한 것입니다 :

한 번만 코드를 실행합니다.

내가 말하는 이유는 너무 많이 만들어서 제어 할 수 없기 때문입니다. 그리고 당신의 시간 정의는 무엇입니까? 운영 체제가 프로세스를 대기 대기열에 넣기로 결정했다고 가정합니다.

다음으로 캐시 성능, 메모리 대기 시간, 디스크 입출력 등으로 인해 예측할 수없는 부분이 있습니다. 이것들은 모두 한 가지로 끓습니다. 때로는 코드에서 사용할 수있는 프로세서로 정보를 가져 오는 데 시간이 걸릴 수 있습니다. 코드 자체를 가져 오거나 해독하는 데 걸리는 시간을 포함합니다.

또한 차이는 얼마나됩니까? 40 밀리 초이면 괜찮을 수도 있고 10 나노 초이면 괜찮을 수도 있습니다.

응용 프로그램 도메인에 따라 차이를 마스크 처리하거나 숨길 수도 있습니다. 컴퓨터 그래픽 사용자들은 각 프레임을 렌더링 할 때의 시간 차이를 숨기기 위해 수년 동안 화면 버퍼를 렌더링하지 못했습니다.

기존의 솔루션은 알려진 가변 속도 작업을 가능한 한 많이 제거합니다. RAM에 파일을로드하고 캐시를 예열하고 IO를 피하십시오.

+0

모든 유효한 점, 그러나 문제는 I/O, 페이징, 최소 OS 등이없는 "베어 메탈"응용 프로그램과 관련됩니다. – Benoit

0

중요한 코드 인 'inline'에서 모든 함수 호출을 수행하고 변수 수를 최소화하여 'register'유형을 갖도록 할 수 있습니다. 이렇게하면 프로그램 실행 시간이 향상됩니다. (컴파일러가 요즘은 '등록'태그를 무시하는 경향이 있으므로 특별한 방법으로 컴파일해야 할 것입니다.)

메모리에서 무언가를로드하려고 할 때 페이지 폴트가 발생하지 않을만큼 충분한 메모리가 있다고 가정합니다 . 페이지 폴트는 많은 시간이 걸릴 수 있습니다.

또한 생성 된 어셈블리 코드를보고 실행중인 코드를 변경할 수있는 분기 및 메모리가 많이 있는지 확인할 수 있습니다.

코드 실행시 인터럽트가 발생하면 시간이 오래 걸립니다. 인터럽트/예외를 사용하도록 설정 했습니까?

관련 문제