อาการ
เมื่อคุณสร้างโปรแกรม โดยใช้ Microsoft 2013 ของ Visual C++ โปรแกรมล้มเหลว และคุณได้รับข้อยกเว้น "คำสั่งไม่ถูกต้อง" เหตุการณ์นี้เกิดขึ้นเนื่องจากบางฟังก์ชันไลบรารีคณิตศาสตร์ทศนิยมในขณะใช้งานจริง 2013 Visual C++ x64 C (CRT) ไม่ถูกต้องตรวจสอบว่า บางคำสั่ง AVX และ FMA3 รกฟังก์ชันพยายามใช้แฟ้มนั้น ถ้าคำสั่งนั้นไม่พร้อมใช้งาน การเรียกไปยังฟังก์ชันเหล่านี้ทำให้เกิดข้อยกเว้นคำสั่งไม่ถูกต้อง (0xc000001d) ฟังก์ชันที่ได้รับผลกระทบรวมล็อก log10 และ pow และอื่น ๆ
ปัญหานี้ไม่น่าจะเกิดขึ้นในสถานการณ์ต่อไปนี้:
-
บนระบบปฏิบัติการ Windows ที่สนับสนุน AVX รุ่นเก่ารัฐบันทึก (ตัวอย่างเช่น Windows Vista) ถ้า มีใช้บนคอมพิวเตอร์ที่สนับสนุนชุดคำสั่ง AVX
-
ถ้าบันทึกสถานะ AVX ถูกปิดการใช้งานอย่างชัดเจนในการกำหนดค่าระบบปฏิบัติการเริ่มต้นระบบ
-
ในแวดล้อม Preinstall Windows (Windows PE)
หมายเหตุ Windows PE ไม่สนับสนุนการบันทึกสถานะ AVX
ปัญหานี้ได้ถูกรายงานบนการเชื่อมต่อของ Microsoft:
x64 ฟังก์ชัน log() ใช้คำสั่ง AVX vpsrlq แหล่งระบบปฏิบัติการ (ดังนั้นล้มเหลวบน Vista x64)
Visual Studio 2013 RTM: c ++ x64 รหัสข้อบกพร่องของการสร้างคำแนะนำ AVX2
สาเหตุ
ปัญหานี้เกิดขึ้นเนื่องจากรันไทม์ของแอ 2013 Visual C++ x64 C ตรวจสอบว่า ระบบปฏิบัติการที่สนับสนุน AVX สถานะบันทึกก่อนที่จะพยายามเรียกใช้คำสั่ง AVX หรือ FMA3
การแก้ปัญหา
ถ้าทั้งหมดได้รับผลกระทบ c ++ไบนารีที่สร้างขึ้น โดยใช้ Visual C++ 2013 ใช้ DLL รันไทม์ของ C (msvcr120.dll), ติดตั้งการปรับปรุง Microsoft Visual C++ 2013 สามารถเผยแพร่ต่อ – 12.0.40660.0 หรือรุ่นที่ใหม่กว่า
ถ้าไบนารี c ++ของคุณได้รับผลกระทบแบบคงเชื่อมโยง Runtime C 2013 Visual C++ คุณต้องปรับปรุงการติดตั้ง 2013 Studio ภาพ ด้วยการติดตั้งโปรแกรมแก้ไขด่วน 3174417 และสร้างการปรับไบนารีได้รับผลกระทบ
หมายเหตุ ปัญหานี้ไม่มีผลต่อรุ่นที่เก่ากว่าของ Visual C++ C รันไทม์ของแอ (2012 Visual C++ และรุ่นก่อนหน้านี้) ปัญหาถูกแก้ไขก่อนที่จะนำออกใช้เริ่มต้นของจอภาพ CRT Universal ที่ใช้ โดย Visual C++ 2015
ศูนย์ดาวน์โหลดของ Microsoft
การปรับปรุงการเชื่อมโยงแบบคง Visual C++ 2013 C รันไทม์ 3174417 โปรแกรมแก้ไขด่วนถูกนำออกใช้เป็นการปรับปรุงการดาวน์โหลดเพียงอย่างเดียว และไม่แจกจ่ายผ่านทาง Windows Update มีอยู่ในเว็บไซต์ศูนย์ดาวน์โหลดของไมโครซอฟท์:
ดาวน์โหลดแพคเกจ
การปรับปรุงการเชื่อมโยงแบบไดนามิก Visual C++ 2013 C รันไทม์ Dll การปรับปรุงสามารถเผยแพร่ต่อจะพร้อมใช้งาน สำหรับข้อมูลเพิ่มเติม ดูบทความฐานความรู้ของ Microsoft ต่อไปนี้:
ปรับปรุง 3179560 สำหรับ 2013 Visual C++ และแพคเกจที่สามารถเผยแพร่ต่อ Visual C++
วิธีแก้ปัญหา
เมื่อต้องการหลีกเลี่ยงปัญหานี้ ปิดการใช้งาน FMA3 ในไลบรารีคณิตศาสตร์ถ้าคุณได้รับผลกระทบจากปัญหานี้ คุณสามารถสอบถามว่า ระบบสนับสนุนคำสั่ง AVX โดยเรียกGetEnabledXStateFeaturesและปิดใช้งาน AVX ในจอภาพแบบ CRT อย่างชัดแจ้ง โดยการโทรหา_set_FMA3_enable(0)
สำหรับข้อมูลเพิ่มเติม ดูการทำงานกับบริบท XStateบนเว็บไซต์ MSDN
ฟังก์ชัน_set_FMA3_enable(0)จะประกาศใน < math.h > และจะพร้อมใช้งานเฉพาะเมื่อคุณได้สร้างสำหรับ x64 เท่านั้น (นี้ปัญหาผลกระทบเฉพาะ x64 ไลบรารีนั้น) ซึ่งทำให้ไลบรารีคณิตศาสตร์เมื่อต้องการแปลงกลับไปใช้การใช้งานที่ไม่ใช่ FMA3