저는 잠시 동안 SSE로 작업 해 왔으며, 정렬 문제를 봤습니다. 이것은, 그러나, 내 이해를 넘어 :디버거에서 실행되는 경우 Visual Studio에서 데이터가 올바르게 정렬되지 않았습니다.
내가 할 다른 정렬 내가 디버거 (Ctrl + F5) 이외의 실행 여부를 내가 F5 (디버그) 또는 를 사용하여 프로그램을 실행 여부를!
일부 배경 정보
: 은 내가 SSE 지원 데이터 형식에 대한 래퍼를 사용하고 있습니다 - 과부하 사업자 및 사용자 정의 할당과 (_mm_malloc
및
_mm_free
를 사용하여
new
및
delete
연산자를 오버로드). 그러나 아래 예에서 문제를 더욱 줄이기 위해 노력했습니다. 즉 맞춤 할당자를 사용하지 않아도 문제가 발생합니다.
아래에서 볼 수 있듯이 main()에서 동적으로 SSEVector 유형 객체가 들어있는 힙에 TestClass 객체를 할당합니다. 스택에 "missalign"하기 위해 dummy 변수 float[2]
을 사용하고 있습니다. 나는 F5로 실행하면
나는 다음과 같은 출력을 얻을 :
object address 00346678
_memberVariable1 address 00346678
_sseVector address 00346688
을 내가 Ctrl + F5로 실행하는 경우 :
object address 00345B70
_memberVariable1 address 00345B70
_sseVector address 00345B80
당신이 볼 수 있듯이, 정렬 다른 (즉 아니다 16 바이트) 디버거에서 실행할 때. Ctrl-F5를 사용할 때 정렬이 정확하다는 것은 단지 우연의 일치입니까? Visual Studio 2010을 새 프로젝트 (기본 설정)와 함께 사용하고 있습니다.
스택에 개체 (예 : TestClass myObject;
)를 선언하면이 문제가 나타나지 않습니다. __declspec(align(16))
을 사용하면 도움이되지 않습니다.
내가 문제를 재현하는 데 사용되는 코드 :
#include <iostream>
#include <string>
#include <xmmintrin.h> // SSE
//#include "DynAlignedAllocator.h"
//////////////////////////////////////////////////////////////
class SSEVector /*: public DynAlignedAllocator<16>*/
{
public:
SSEVector() { }
__m128 vec;
};
class TestClass
{
public:
TestClass() { }
/*__declspec(align(16))*/ float _memberVariable1 [2];
SSEVector _sseVector;
};
//////////////////////////////////////////////////////////////
int main (void)
{
TestClass* myObject = new TestClass;
std::cout << "object address " << myObject << std::endl;
std::cout << "_memberVariable1 address " << &(myObject->_memberVariable1) << std::endl;
std::cout << "_sseVector address " << &(myObject->_sseVector) << std::endl;
delete myObject;
// wait for ENTER
std::string dummy;
std::getline(std::cin, dummy);
return 0;
}
어떤 힌트 또는 논평이 크게 감사하고 있습니다. 미리 감사드립니다.
MS가 8192 일 수 있다고 말하는데도 '__declspec (align (numBytes)) float'에 대해 동일한 문제가 있습니다. https://msdn.microsoft.com/en-us/library /83ythb65.aspx. 어떻게 그걸 해결 했니? 디버그 모드에서만 발생합니다. – Royi