그렇습니다. 데이터 정렬과 배열 모두 성능에 큰 차이를 만들 수 있습니다. 몇 퍼센트뿐만 아니라 몇 퍼센트에서 수백 퍼센트까지도 마찬가지입니다.
루프를 충분히 실행하면 두 가지 지침이 중요합니다.
.globl ASMDELAY
ASMDELAY:
subs r0,r0,#1
bne ASMDELAY
bx lr
캐시 유무와 분기 예측에서 캐시 토스 유무에 따른 정렬을 통해 두 명령 성능을 상당한 양 (타이머 틱)으로 변경할 수 있습니다.
min max difference
00016DDE 003E025D 003C947F
스스로 쉽게 수행 할 수있는 성능 테스트. 테스트중인 코드 주위에 nops를 추가 또는 제거하고 정확한 타이밍 작업을 수행하고, 테스트중인 명령어를 넓은 범위의 주소를 따라 이동하여 캐시 라인의 가장자리 등을 만지십시오.
데이터 액세스와 같은 종류의 것. 일부 아키텍처는 데이터 오류를 제공하여 정렬되지 않은 액세스 (예 : 주소 0x1001에서 32 비트 읽기 수행)에 대해 불평합니다. 그중 일부는 오류를 비활성화하고 성능을 저하시킬 수 있습니다. 정렬되지 않은 액세스를 허용하는 다른 사용자는 성능 저하를 얻습니다.
때때로 "지침"이지만 대부분의 경우 클럭 / 버스 사이클입니다.
다양한 대상에 대한 gcc의 memcpy 구현을 살펴보십시오. 0x43 바이트의 구조를 복사한다고 가정하면 0x42를 떠나는 1 바이트를 복사 한 다음 0x40 바이트를 큰 효율적인 청크로 복사 한 다음 마지막 0x2는 두 개의 개별 바이트 또는 16 비트 전송으로 수행 할 수 있습니다. 소스 및 대상 주소가 0x1003 및 0x2003과 같은 동일한 정렬에 있으면 정렬 및 대상이 작동합니다. 한 바이트를 수행 한 다음 큰 청크에서 0x40을 누른 다음 0x2를 수행 할 수 있지만 하나는 0x1002이고 다른 하나는 0x1003이면 얻을 수 있습니다 진짜 못 생겼고 천천히
대부분의 경우 버스주기입니다. 또는 전송 횟수가 더 나쁩니다. ARM과 같은 64 비트 폭의 데이터 버스가있는 프로세서를 가져 와서 주소 0x1004에서 4 워드 전송 (읽기 또는 쓰기, LDM 또는 STM)을 수행하십시오. 즉, 워드 정렬 주소이며 완벽하게 합법적이지만 버스가 64 인 경우 비트 폭이 경우 단일 명령어는이 경우 0x1004에서 32 비트, 0x1008에서 64 비트, 0x100A에서 32 비트로 3 개의 전송으로 바뀔 수 있습니다. 그러나 동일한 명령을 가지고 있지만 주소 0x1008에서는 주소 0x1008에서 단일 4 워드 전송을 수행 할 수 있습니다. 각 전송에는 관련 설정 시간이 있습니다. 따라서 0x1004 ~ 0x1008 주소 차이 자체는 캐시를 사용할 때 짝수 / 더 빠를 수 있으며 모두 캐시 적중입니다.
말하자면, 주소 0x1000 대 0x0FFC에서 두 단어 읽기를하더라도 캐시 누락이있는 0x0FFC는 두 개의 캐시 라인 읽기를 유발합니다 .0x1000은 하나의 캐시 라인입니다. 액세스 (사용하는 것보다 많은 데이터 읽기)하지만 두 배가됩니다. 구조가 일반적으로 정렬되거나 데이터가 일반적인 방식 및 해당 데이터에 액세스하는 빈도 등으로 인해 캐시 스 래싱이 발생할 수 있습니다.
퇴거를 생성 할 수있는 데이터를 처리 할 때 캐시의 일부만 사용하여 실제 운이 나빠질 수 있으며 데이터를 건너 뛰면 다음 데이터 블롭이 이전 블롭과 충돌 할 수 있습니다. . 소스 코드 등에서 데이터를 믹싱하거나 함수를 다시 정렬하면 충돌을 생성하거나 제거 할 수 있습니다. 모든 캐시가 동일하게 생성되는 것은 아니기 때문에 컴파일러가 여기에있는 것은 아닙니다. 성능 저 하나 개선을 감지하는 것조차 당신에게 달려 있습니다.
성능 향상, 더 넓은 데이터 버스, 파이프 라인, 캐시, 분기 예측, 다중 실행 단위 / 경로 등을 개선하기 위해 추가 한 모든 사항은 대부분 도움이되지만 의도적으로 또는 우연히 악용 될 수있는 약점을 가지고 있습니다. 성능에 관심이 있고 튜닝해야 할 가장 큰 튜닝 요소 중 하나는 32, 64, 128, 256뿐만 아니라 코드와 데이터의 정렬입니다. 비트 경계뿐만 아니라 사물이 서로 관련되어있는 경우 루프를 많이 사용하거나 재사용 된 데이터를 동일한 캐시 방식으로 랜딩하지 않기를 원할 경우 각각 자체적으로 원합니다. 컴파일러는 예를 들어 슈퍼 스칼라 아키텍처에 대한 명령어 순서를 정하고 서로에 대해 중요하지 않은 명령어를 다시 정렬 할 수 있습니다.
가장 큰 감독은 프로세서가 병목 상태라는 가정입니다. 10 년 이상 사실이 아니었다면, 프로세서를 공급하는 것이 문제이며, 정렬 성능 저하, 캐시 스 래싱 등과 같은 문제가 발생합니다. 소스 코드 수준에서도 약간의 작업만으로 구조에서 데이터 재정렬, 변수 / 구조 선언 순서, 소스 코드 내 함수 순서 및 데이터 정렬을위한 약간의 추가 코드로 여러 번의 성능을 향상시킬 수 있습니다. 더.