2012-02-09 2 views
4

내 프로젝트에서 일부 코드의 속도를 높이기 위해 SSE를 사용할 것을 고려하고 있습니다. 이것은 보통 내가 작업하고있는 데이터의 16 바이트 정렬을 필요로합니다. 정적 할당을 위해 나는 __declspec(align(16))이 문제를 해결하지만 내 문제는 다음과 같다고 가정합니다 : 동적 할당을 할 때 가장 좋은 방법은 무엇입니까? 특히 할당 된 객체가 정렬을 직접 요구하지는 않지만 정렬 요구 사항이있는 객체를 멤버로 사용하므로 (올바르게 정렬되었는지 잊어 버리는 것이 훨씬 쉽습니다). 나는 다음과 같은 해결책을했다 : 정렬 된 멤버가있는 개체의 동적 할당 - 가능한 솔루션?

  1. 항상 잠재적으로 비 정적으로 할당 된 데이터가 정렬되지 않은 것으로 가정하고 정렬되지 않은로드 명령을 사용합니다. 내가 읽은 것에서 이것은 느리고 이것이이 경우 SSE에 신경 쓰지 않을 수도 있습니다. 구현할 수는 있지만 수행 방법을 테스트 할 수는 있지만 가치있는 것이 아니라 다른 솔루션이 있다는 것을 알기 위해 많은 노력을 기울이기 전에 더 나은 솔루션에 대해 물어볼 것입니다.

  2. 맞춤을 필요로하는 개체와이를 개체로 사용하는 개체를 할당하려면 매우 신중해야하며 _aligned_malloc/_aligned_free 만 사용해야합니다. 이것은 아마도 잊기 쉽고 따라서 오류가 발생하기 쉽습니다. new/delete

  3. 과부하는 전 세계적으로 및/또는 메모리를 정렬하고 모두를위한들을 사용하는 사용자 정의 malloc/free 기능을 만들 수 있습니다. 그러나 글자 그대로 을 모두에 동적으로 할당하는 것이 가장 좋은 방법은 아닙니다.

  4. 오버플로 된 기본 클래스를 만들고 new/delete 연산자를 사용하고 정렬이 필요한 클래스와이를 사용하는 클래스를 상속 받아야합니다. 대부분의/모든 동적 할당에 new/delete을 사용하면됩니다. 아마도 덜 오류가 발생하기 쉬운 것 같습니다.

  5. 다른 방법으로 생각하지 않았거나 인식하지 못했습니다.

옵션 1.-3. 아마 최고의 아이디어가 아닙니다. 4.는 어때? 내가 언급 한 것에 대해 내가 틀린가? 이 주제에 대한 제안, 의견, 유용한 링크?

사전 : Windows에서

+0

왜 필요한 회원들을 정렬하지 않습니까? 더 쉽게 살 수 있습니다. – Xeo

+1

만약 당신이 (그리고'__declspec (정렬)'또는 유사한 작업을 어떻게하는지) 이해한다면 올바르게 변하지 않을 것입니다.만약 내가'Foo' 클래스를 정렬해야한다면 클래스 정의 멤버로 사용할 때 명시 적으로 정렬 할 필요없이 모든 _static_ 할당에 대해 적절하게 정렬하는'__declspec (align (16))'을 사용합니다. '바 '. 이것은 동적 인 할당을 위해 아무 것도 바뀌지 않습니다. 그리고 저는 Foo와 Bar 모두에 대해 언급 한 솔루션 중 하나와 그 둘 중 하나를 멤버로 사용하는 다른 클래스를 사용해야 만합니다. –

답변

3

에 감사 malloc에 ​​정렬 16 바이트 (msdn)입니다. 플랫폼 malloc의 정렬 요구 사항이 낮 으면 SSE에서 사용하는 객체에 정렬 된 버전의 malloc을 사용해야합니다.

편집 : 당신이 SSE 필요 객체의 특정 클래스가 있다면 당신은/새로운 재정 해당 클래스에 대해 삭제할 수 있습니다 지원합니다.

+2

링크를 제공해 주셔서 감사합니다. 나는 안타깝지만 분명히 이것은 64 비트 플랫폼에서 32 비트'malloc'을 위해 컴파일되었을 때 8 바이트로 정렬되고 기본 동작을 16으로 변경하면 32 비트 플랫폼에서 성능에 부정적인 영향을 미칠 것입니다. 네, "가장 깨끗하고 안전한 솔루션은 SSE를 직접 사용하거나 멤버 중 하나를 통해 사용하는 모든 클래스에 대해'new' /'delete'를 오버로드하고 링크에서 새로운 정보를 사용하는 것입니다. 64 비트 플랫폼 용으로 컴파일 할 때 해당 코드를 비활성화하십시오. –

+0

@CuriousCppUser 기본 할당자가 전역'operator new'를 호출하기 때문에 정렬 된 객체에 대해 표준 컨테이너에 맞춤 할당기를 제공하는 것을 잊지 마십시오. –

0

실용적이지 않은지 확실하지 않지만 Doug Lea's allocator을 사용하고 필요에 맞게 (최대 128 바이트) MALLOC_ALIGNMENT 매크로를 정의 할 수 있습니다.

기본 할당자를 바꿀 필요조차 없습니다. Doug Lea 특정 dlmallocdlfree을 SSE 요구 사항에만 사용할 수 있어야하고 나머지 모든 항목에 기본 할당자를 계속 사용해야합니다.

관련 문제