2014-07-18 4 views
2

리눅스에서 C++로 바이트 처리를 위해 큰 문자 배열을 만드는 코드를 작성했습니다. 몇 가지 독서를 한 후에 16 바이트 경계에 배열을 정렬해야하는지 궁금 해서요. 이것이 CPU가 SSE를 이용할 수있게 할 수 있습니까?C++/Linux 성능상의 이유로 문자 배열 정렬?

그렇다면 GCC 컴파일러에 배열을 정렬 할 위치를 알려주려면 어떻게해야합니까?

+0

가장 간단한 해결책은 정렬 된 메모리 블록에 대한 포인터를 반환하는'malloc '을 호출하는 것입니다. –

+0

먼저 깨끗하고 재사용 가능한 코드를 작성해야합니다. 미션 크리티컬 애플리케이션을 가지고 있지 않다면이 배열에 대해 걱정할 필요가 없습니다. – Brian

+0

일부 코드를 사용하여 수행하려는 작업에 대해 자세히 설명하십시오. – edmz

답변

-1

일반적으로 배열 대신 벡터를 사용해야합니다. 이것은 또한 정렬 문제를 해결할 것입니다.

+0

표준에 따라 벡터 정렬이 필수입니까? – Quentin

+0

(-1) @Emanuele Paolini. 중요 응용 프로그램에서는 메모리 관리가 중요합니다. 나는 많은 functuonality를위한 STL 벡터를 좋아하지만, 많은 경우에, 배열은 ar 성능이 더 좋다. 단지 2 센트. – umlcat

1

메모리 정렬로 인해 GCC에서 직접 SSE 코드를 생성하지 않습니다. -msse, -mtune처럼

  1. GCC Optimize Options : 당신이 정말 GCC는 SSE 코드를 생성하려면 다음 중 하나 이상을 사용해야합니다. 포인트 2 항과 3 항에서, SSE 지침으로 확실히 동안 SSE 명령어가 여전히 발생 여부를

  2. 조립, 또는 Inline Assembly 점 1에서

  3. GCC Vector Extensions

는 컴파일러에 따라 달라집니다 생성됩니다.

XMM 레지스터가 SSE와 관련되어 있으므로 많은 SSE 명령어는 128 비트에 대해 엄격한 메모리 정렬이 필요합니다. 형식 정의에 GCC Type Attributes__attribute__ ((aligned (N)))을 사용하여이를 확인할 수 있습니다.

참고 : 메모리 정렬은 SSE 명령어의 잠재적 인 사용뿐만 아니라 아톰 명령어 및 효율적인 캐시 연산의 사용에도 도움이됩니다. 많은 플랫폼에서 명령어는 크기만큼 정렬 된 메모리에 액세스 할 때만 원자 적입니다. 한편, 캐시는 대개 메모리에 안정적으로 매핑되는 라인 그룹으로 구성되며 캐시 라인 경계를 넘으면 한 번 더 액세스해야합니다.

는 또한 주 : malloc은 적절히에 부합되는 포인터를 반환 보장 어떤 내장 타입합니다 ( malloc 매뉴얼 페이지를 참조하십시오). 자신이 정의한 구조체를 정렬하려면 위의 GCC Type Attributes __attribute__ ((aligned (N)))을 사용해야합니다.

+0

GCC의 전문가는 아니지만 귀하의 답변이 더 자세하고 지원되는 것으로 보입니다. – umlcat