2013-04-12 8 views
1

효율성이 std::vector::push_back 인 이 발견되었습니다. 관련 코드는 here입니다. 나는 그것을 자신을 시도하고 내가 illegal instruction (core dumped)있어, GDB는 오류가 라인에서 발생 표시 (37)C++ 코드의 어셈블리 언어로 오류 프로파일 링

I가있는 컴퓨터에서, GCC 4.7.2을 사용하여 컴파일 :

$ sudo dmidecode -t processor 
# dmidecode 2.11 
SMBIOS 2.5 present. 

Handle 0x0400, DMI type 4, 40 bytes 
Processor Information 
    Socket Designation: CPU 
    Type: Central Processor 
    Family: Core 2 Duo 
    Manufacturer: Intel 
    ID: 7A 06 01 00 FF FB EB BF 
    Signature: Type 0, Family 6, Model 23, Stepping 10 
    Flags: 
     FPU (Floating-point unit on-chip) 
     VME (Virtual mode extension) 
     DE (Debugging extension) 
     PSE (Page size extension) 
     TSC (Time stamp counter) 
     MSR (Model specific registers) 
     PAE (Physical address extension) 
     MCE (Machine check exception) 
     CX8 (CMPXCHG8 instruction supported) 
     APIC (On-chip APIC hardware supported) 
     SEP (Fast system call) 
     MTRR (Memory type range registers) 
     PGE (Page global enable) 
     MCA (Machine check architecture) 
     CMOV (Conditional move instruction supported) 
     PAT (Page attribute table) 
     PSE-36 (36-bit page size extension) 
     CLFSH (CLFLUSH instruction supported) 
     DS (Debug store) 
     ACPI (ACPI supported) 
     MMX (MMX technology supported) 
     FXSR (FXSAVE and FXSTOR instructions supported) 
     SSE (Streaming SIMD extensions) 
     SSE2 (Streaming SIMD extensions 2) 
     SS (Self-snoop) 
     HTT (Multi-threading) 
     TM (Thermal monitor supported) 
     PBE (Pending break enabled) 
    Version: Not Specified 
    Voltage: 1.2 V 
    External Clock: 1333 MHz 
    Max Speed: 5200 MHz 
    Current Speed: 3000 MHz 
    Status: Populated, Enabled 
    Upgrade: Socket LGA775 
    L1 Cache Handle: 0x0700 
    L2 Cache Handle: 0x0701 
    L3 Cache Handle: Not Provided 
    Serial Number: Not Specified 
    Asset Tag: Not Specified 
    Part Number: Not Specified 
    Core Count: 2 
    Core Enabled: 2 
    Thread Count: 2 
    Characteristics: 
     64-bit capable 

문제가 여기에 무엇입니까? 이 코드를 어떻게 작동시킬 수 있습니까? 나는 또한 icpc 13.1.0으로 시도했지만 이것 역시 실패했다.

편집 : 저는 우분투 12.10 64 비트를 사용하고 있습니다.

+0

코어 i7에서 gcc 4.2로 잘 작동합니다 - 어떤 OS를 사용하고 있습니까? –

+0

37 행의 오류가 오류가 정확하게 있음을 의미하지는 않습니다. 해체를보고 정확히 어떤 명령이 원인인지 확인해야합니다. –

+0

@AlexeyFrunze 감사합니다. 어떻게 그렇게 할 수 있습니까? 또한'stopRDTSC'와 같이 모든 asm 호출을 포함하고 있기 때문에 오류가 'startRDTSC' 함수에보고되지 않는 것은 이상합니다. 그러나 먼저 호출되고 작동하는 것으로 보입니다. 내 전체 스택 트레이스는 다음과 같습니다 : testvector.cpp의 stopRDTSCP에서 0 : 37 testbector.cpp의 CPUBenchmark :: stop 중 55 : 2는 testvector.cpp의 메인에 있습니다 : 177' – mkm

답변

1

CPU가 RDTSCP 명령어를 지원하지 않습니다. Core i7 명령어이고 프로세서가 이전 세대 (Merom-L)입니다.

대신 RDTSC을 사용할 수 있습니다. 예를 들어, Difference between rdtscp, rdtsc : memory and cpuid/rdtsc?

+0

또는이 명령의 사용은'CR4.TSD' = 0을 통해 비활성화됩니다. –

+0

@AlexeyFrunze : Merom-L CPU이고 Core i7보다 우위에 있습니다. – NPE

+0

@NPE 아, 방금 시도했는데 제대로 작동하는 것 같습니다. 링크를 가져 주셔서 감사합니다. 올바르게 이해한다면 'RDTSC'로 변경하면 성능 저하가 발생할 수 있습니다. 그런 다음이 코드의 유용성을 프로파일 링 도구로 망칠 수 있습니까? – mkm