2016-06-22 1 views
4

내 응용 프로그램에 크래시 덤프가 있습니다. 일부 사용자가 "잘못된 명령어"라는 SSSE 명령어를 실행하려고하면 내 응용 프로그램이 실패합니다.사용자 모드 크래시 덤프가있는 CPU 모델 찾기

WinDBG에서 CPU 모델을 찾아서 명령어 세트를 찾아서 명령어 세트를 지원하거나 응용 프로그램의 최소 하드웨어 요구 사항을 업데이트 할 수 있습니까?

여기 !cpuid의 출력입니다 :

CP F/M/S Manufacturer  MHz 
0 16,4,3 <unavailable> 3000 
1 16,4,3 <unavailable> 3000 
2 16,4,3 <unavailable> 3000 
3 16,4,3 <unavailable> 3000 

구글 도움이 될라는 명령의 나머지 인쇄 "찾을 수 없습니다 수출"(errrec, cpuinfo의, sysinfo가!!!).

답변

5

여기서 많은 정보를 얻지는 않을 것입니다. 덤프에 보통 의 원시 CPU 정보가 없더라도 최소한 제조업체 문자열을 확인해야합니다. 오, 글쎄, 여기에서 같이 일해야 할 일을 살펴 보자 ...

CP 열은 논리 프로세서 번호를 제공하므로 4 개의 논리 프로세서가있는 시스템을 처리하고 있다는 것을 알 수 있습니다. 쿼드 코어 또는 HyperThreading이 포함 된 듀얼 코어 일 수 있습니다.

F/M/S은 프로세서를 식별하는 공통적 인 표준 방법 인 Family/Model/Stepping입니다. AMD가 말하기를 :

프로세서 가족는 소프트웨어 또는 하드웨어 목적을 위해 몇 가지 일반적인 정의를 가지고 그룹에 속하는 하나 개 이상의 프로세서를 식별합니다. 모델은 하나의 프로세서 제품군 인스턴스를 지정합니다. 스테핑은 특정 모델의 특정 버전을 식별합니다. 따라서 가족, 모델 및 스테핑을 함께 취하면 프로세서에 대한 고유 한 식별 또는 서명이 형성됩니다.

당신이 가족의 숫자는 꽤 혼란 때문에 이런 일을 찾고 갈 때 제조업체에있는 경우에 가장 유용하지만, 다행히도이 (16 진수 10) (16)의 가족 수는 AMD에 해당 꽤 분명 프로세서 (제조업체 문자열 "AuthenticAMD"가 있어야 함). 특히 바르셀로나 마이크로 아키텍처 인 AMD K10입니다. 즉, 하이퍼 스레딩이 없다는 의미입니다. 이것은 네이티브 쿼드 코어 시스템에 불과합니다.

모델을보고 더 자세히 분석 할 수 있습니다. Athlon II, Opteron, Phenom, Phenom II, Sempron, Turion 및 V-Series와 같이 다양한 브랜드의 바르셀로나 코어를 기반으로 한 다양한 모델이있었습니다. 모델 4입니다. 다양한 CPU의 모델 번호와 스테핑을 나열하는 좋은 리소스를 알지 못하기 때문에 다소 까다로운 부분입니다. 제조업체에 직접 가서 설명서를 읽어야합니다. 예 : here is AMD's Revision Guide for the 10h Family. "프로세서 식별"섹션 (PDF에 책갈피로 표시됨)으로 이동하면 유망 해 보이지만 정보는 쉽게 소화 할 수있는 형태로 표시되지 않습니다. 패밀리 (8-11), 모델 (4-7) 및 스테핑 (0-3)에 해당하는 개별 비트를 추출해야하는 긴 16 진수 값을 가져옵니다.

AMD는 AMD Phenom II X4라는 사실을 확신하고 있습니다. X4는 쿼드 코어와 잘 어울리 며, Phenom II는 모델 4 인 것처럼 보입니다.

어쨌든 마이크로 아키텍처에서 알아야 할 모든 것을 알려주기 때문에 잠시 멈출 수있었습니다. 이것은 AMD 바르셀로나 코어로, Supplemental SSE3 (SSSE3) 지침 (세 개, 세 개는 SSE3과 혼동하지 말아야하며, 명명 규칙은 어리 석다)을 지원하지 않습니다. SSSE3은 Intel에서 개발했으며 Core 2 마이크로 아키텍처와 함께 출시되었습니다.

AMD는 Bobcat/Bulldozer까지 이들을 구현하지 않았습니다. Bulldozer은 차세대 데스크톱 및 서버 제품군 21 (15h)이었으며, Bobcat은 AMD APU의 저공해 코어였습니다.

SSSE3은 실제로 많은 새로운 지침을 제공하지 않았습니다. 주로 16 진수이며, 주로 팩형 정수로 작업하기위한 것이며, 대부분은 aren't very exciting입니다. 덤프 일 경우도 충돌을 일으킨 명령어의 opcode를 알려줍니다. 그렇지 않은 경우 코드의 바이트 주소에서 다시 찾아야합니다. 이렇게하면 어떤 명령이 문제인지 정확하게 알 수 있습니다. 당신이 PSHUFB을 사용하여 실제로 사용하기 쉬운 SSSE3 명령어 인 바이트를 임의로 뒤섞는 것으로 추측합니다. 필자가 보았던 한 가지 공통적 인 사용은 a fast population count algorithm입니다 (단, SSSE3을 필요로하지 않는 다른 구현이 있어도 빠르지는 않지만 거의 동일합니다).

당신이 MSVC로 컴파일한다고 가정 할 때, 나는 실제로이 명령을내는 것을보고 놀랬습니다. 그것을 얻기 위해서는 컴파일러에게 AVX를 타겟으로 지정해야합니다. 그러면 코드가 Sandy Bridge/Bulldozer보다 오래된 것에서 실행되지 않게됩니다. 최소 시스템 요구 사항을 높이기를 원하지 않는다면 동일한 작업을 수행 할 수있는 대체 지침을 찾아 낼 수 있습니다. pshufd 또는 movaps + shufps이 대안의 후보가 될 수 있습니다.

+0

입력 해 주셔서 감사합니다. 예, Visual Studio로 건물. 해당 지침을 내보내는 컴파일러가 아닙니다. intrinsics를 사용하여 코드를 수동으로 벡터화했습니다. AFAIR은 AVX2에 대한 자동 벡터화와 비교하여 약 두 배 빨라졌습니다. 내 알고리즘은 대부분 정수/비트 마스크, 기가 바이트를 처리하며 이러한 __m128i 값을 처리하는 많은 비트 트릭을 코딩했습니다. 나는 자동 벡터 라이 제이션이 여기에서했던 것과 비교할만한 최적화를 할 수 있다고 믿지 않는다. – Soonts

+0

알다시피 CPU 호환성은 이러한 접근 방식의 단점입니다. 지난 10 년 동안 x86 명령어 세트와 같은 것이 더 이상 존재하지 않는다는 사실을 깨달았을 때 정말 실망했습니다. Intel/AMD는 갈라졌습니다. SSE 4.1 이하에만 의존 할 수있는 것 같습니다. 그들은 이미 9 살입니다 ... – Soonts

+1

그냥 내가 따라 잡을 것 같아서이 정도의 포스트가있어 내가 얼마나 멀리 가야 하는지를 증폭시킵니다. 당신은 꿀꺽 꿀꺽 마실 권리에 갈 수 있었지만 그것을 교육적으로 만들도록 선택했을 수 있습니다. 책을 쓰십시오. 내가 살거야. –

3

명령 !sysinfo, !cpuinfo!errec는 커널이 kdexts 확장에 정의 된 명령을, 덤프, 그래서 그들은 사용자 모드 디버깅에서 사용할 수없는 당신이 명시 적으로 확장을로드하는 경우 아마 잘 작동하지 않습니다.

Stream 7: type SystemInfoStream (7), size 00000038, RVA 000000BC 
    ProcessorArchitecture 0000 (PROCESSOR_ARCHITECTURE_INTEL) 
    ProcessorLevel   0006 
    ProcessorRevision  2A07 
    NumberOfProcessors  04 
    ... (OS specifics) ... 

불행하게도, 그것은 정확히 !cpuid에 의해 표시와 같은, 그래서 거기 :

유일한 생각은 내가 가진 덤프에서 더 많은 정보를 얻을하는 출력 스트림은 다음과 같습니다 SystemInfoStream라고합니다 .dumpdebug했다 실제로 더 이상 덤프에 포함 된 정보가 없습니다.