리눅스에서 C++로 바이트 처리를 위해 큰 문자 배열을 만드는 코드를 작성했습니다. 몇 가지 독서를 한 후에 16 바이트 경계에 배열을 정렬해야하는지 궁금 해서요. 이것이 CPU가 SSE를 이용할 수있게 할 수 있습니까?C++/Linux 성능상의 이유로 문자 배열 정렬?
그렇다면 GCC 컴파일러에 배열을 정렬 할 위치를 알려주려면 어떻게해야합니까?
리눅스에서 C++로 바이트 처리를 위해 큰 문자 배열을 만드는 코드를 작성했습니다. 몇 가지 독서를 한 후에 16 바이트 경계에 배열을 정렬해야하는지 궁금 해서요. 이것이 CPU가 SSE를 이용할 수있게 할 수 있습니까?C++/Linux 성능상의 이유로 문자 배열 정렬?
그렇다면 GCC 컴파일러에 배열을 정렬 할 위치를 알려주려면 어떻게해야합니까?
메모리 정렬로 인해 GCC에서 직접 SSE 코드를 생성하지 않습니다. -msse
, -mtune
처럼
GCC Optimize Options : 당신이 정말 GCC는 SSE 코드를 생성하려면 다음 중 하나 이상을 사용해야합니다. 포인트 2 항과 3 항에서, SSE 지침으로 확실히 동안 SSE 명령어가 여전히 발생 여부를
조립, 또는 Inline Assembly 점 1에서
는 컴파일러에 따라 달라집니다 생성됩니다.
XMM 레지스터가 SSE와 관련되어 있으므로 많은 SSE 명령어는 128 비트에 대해 엄격한 메모리 정렬이 필요합니다. 형식 정의에 GCC Type Attributes__attribute__ ((aligned (N)))
을 사용하여이를 확인할 수 있습니다.
참고 : 메모리 정렬은 SSE 명령어의 잠재적 인 사용뿐만 아니라 아톰 명령어 및 효율적인 캐시 연산의 사용에도 도움이됩니다. 많은 플랫폼에서 명령어는 크기만큼 정렬 된 메모리에 액세스 할 때만 원자 적입니다. 한편, 캐시는 대개 메모리에 안정적으로 매핑되는 라인 그룹으로 구성되며 캐시 라인 경계를 넘으면 한 번 더 액세스해야합니다.
는 또한 주 :
malloc
은 적절히에 부합되는 포인터를 반환 보장 어떤 내장 타입합니다 (
malloc
매뉴얼 페이지를 참조하십시오). 자신이 정의한 구조체를 정렬하려면 위의
GCC Type Attributes
__attribute__ ((aligned (N)))
을 사용해야합니다.
GCC의 전문가는 아니지만 귀하의 답변이 더 자세하고 지원되는 것으로 보입니다. – umlcat
가장 간단한 해결책은 정렬 된 메모리 블록에 대한 포인터를 반환하는'malloc '을 호출하는 것입니다. –
먼저 깨끗하고 재사용 가능한 코드를 작성해야합니다. 미션 크리티컬 애플리케이션을 가지고 있지 않다면이 배열에 대해 걱정할 필요가 없습니다. – Brian
일부 코드를 사용하여 수행하려는 작업에 대해 자세히 설명하십시오. – edmz