문제

ARM926EJS를 사용하고 있습니다.Linux 없이(시작하기 실행 파일과 마찬가지로) 메모리 복사 테스트에서 메모리 속도가 20% 더 빨라졌습니다.그러나 Linux에서는 동일한 코드가 20% 느리게 실행됩니다.

코드는

 
/// Below code just performs burst mode memcopy test.        
void asmcpy(void *a, void *b, int iSize)
{
   do
  {
    asm volatile (
             "ldmia %0!, {r3-r10} \n\t"
             "stmia %0!, {r3-r10} \n\t"
             :"+r"(a), "+r"(b)
             :
             :"r"(r3),"r"(r4),"r"(r5),"r"(r6),"r"(r7),"r"(r8),"r"(r9),"r"(r10)
             );
  }while(size--)
}

Linux에서 다른 프로세스가 CPU 시간을 사용하지 않는 것을 확인했습니다.( time 명령을 사용하여 이를 확인했는데, 실시간 와 같다 우리 시간)

리눅스에 어떤 문제가 있을 수 있는지 말해주세요.

감사합니다.

추가됨:

내 테스트 코드는

int main()
{
  int a[320 * 120], b[320 * 120];

 for(int i=0; i != 10000; i++)
 {
   /// Size is divided by 8 because our memcpy function performs 8 integer load stores in the iteration
   asmcpy(a, b, (320 * 120) / 8);
 }
}

시작하기 실행 파일은 직렬 포트를 사용하여 RAM으로 전송되고 RAM의 해당 주소로 점프하여 직접 실행되는 bin 파일입니다.(OS가 필요없음)

추가됨.

다른 프로세서에서는 이러한 성능 차이를 본 적이 없습니다. 그들은 SD RAM을 사용하고 있었고, 이 프로세서는 DDR Ram을 사용하고 있습니다.이유가 될 수 있나요?

추가됨.시작 코드에서는 데이터 캐시가 활성화되지 않고 Linux 모드에서는 데이터 캐시가 활성화되므로 이상적으로는 모든 데이터를 캐시하고 RAM 대기 시간 없이 액세스해야 하지만 여전히 Linux는 20% 느립니다.

추가됨:내 마이크로 컨트롤러는 LPC3250입니다.두 테스트 모두 동일한 외부 DDR RAM에서 테스트되었습니다.

도움이 되었습니까?

해결책

이 칩에는 MMU가 있으므로 Linux는 이를 사용하여 메모리를 관리할 가능성이 높습니다.활성화하는 것만으로도 성능 저하가 발생할 수 있습니다.또한 Linux는 게으른 메모리 할당 전략을 사용하여 처음 프로세스에 도달할 때만 메모리 페이지를 프로세스에 할당합니다.큰 메모리 덩어리를 복사하는 경우 MMU는 루프 내부에서 커널에 페이지를 할당하도록 요청하는 페이지 오류를 생성합니다.저가형 프로세서에서는 이러한 모든 컨텍스트 스위치로 인해 캐시 플러시가 발생하고 눈에 띄는 속도 저하가 발생합니다.

시스템이 충분히 작다면 MMU가 없는 Linux 버전(예: uClinux).아마도 비슷한 성능을 가진 더 저렴한 칩을 사용할 수 있을 것입니다.임베디드 시스템에서는 모든 것이 중요합니다.

업데이트: 몇 가지 추가 세부정보:

모든 Linux 프로세스는 자체 메모리 매핑을 가져옵니다. 처음에는 커널과 (아마도) 실행 가능한 코드만 포함됩니다.나머지 선형 4GB(32비트)는 모두 사용 가능한 것으로 보이지만 할당된 RAM 페이지는 없습니다.할당되지 않은 메모리 주소를 읽거나 쓰자마자 MMU는 페이지 오류 신호를 보내고 커널로 전환합니다.커널은 여전히 ​​사용 가능한 RAM 페이지가 많이 있음을 확인하고 하나를 선택하여 오류가 발생한 지점에 할당하고 코드로 돌아가서 중단된 명령을 완료합니다.전체 페이지(일반적으로 4KB)가 이미 할당되어 있으므로 바로 다음 페이지는 실패하지 않습니다.그러나 몇 번의 반복 후에 할당되지 않은 또 다른 공간에 도달하고 MMU가 커널을 다시 호출합니다.

다른 팁

타이밍을 어떻게 수행하고 있습니까? 예제에는 타이밍 코드가 없습니다.

프로세스로드/언로드 시간을 측정하지 않는 것이 확실합니까?

프로세서 클럭 속도는 두 경우 모두 동일합니까?

외부 SDRAM을 사용하는 경우 RAM 타이밍이 두 경우 모두 동일합니까?

두 경우 모두 데이터 캐시가 활성화되어 있습니까?

클리포드

시작하는 것은 "단지 실행 파일"이 아닙니다. DDR 컨트롤러 레지스터를 설정하려면 코드가 있어야합니다.

캐시도 활성화 된 경우 MMU도 마찬가지입니다. ARM926EJS에서는 MMU 없이는 데이터 캐시를 가질 수 없습니다.

캐시가 사실상 색인화되고 사실상 태그가 지정되고 커널 및 사용자 공간이 동일한 주소 공간을 공유하지 않기 때문에 모든 컨텍스트 스위치가 캐시 플러시가 발생한다고 생각합니다. 아마도 OS가없는 것보다 더 원치 않는 캐시 플러시가있을 수 있습니다.

여기에 있습니다 종이 Linux를 실행할 때 VIVT 캐시 플러시 비용에 대한 일부 측면으로

어떤 MicroController (어떤 ARM CPU가 아닌)를 사용하고 있습니까?

비 Linux 실행에서 테스트중인 배열은 Microcontroller 장치 자체에서 RAM 일 가능성이 있습니까? 내부 RAM은 일반적으로 외부 RAM보다 훨씬 빠르게 액세스됩니다. 데이터 캐싱이 Linux 실행에 대해서만 활성화 되더라도 Linux 테스트가 느려질 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top