หลังจากหนึ่งปีของการพัฒนา
GCC 10.1 มีความโดดเด่นในการใช้งานนวัตกรรมมากมายในภาษา C++ ที่พัฒนาขึ้นสำหรับมาตรฐาน C++20 การปรับปรุงที่เกี่ยวข้องกับมาตรฐานภาษา C ในอนาคต (C2x) การเพิ่มประสิทธิภาพใหม่ในแบ็กเอนด์คอมไพเลอร์ และการสนับสนุนการทดลอง
หลัก
-
เพิ่ม โหมดทดลองการวิเคราะห์แบบคงที่ "- เครื่องวิเคราะห์ “ ซึ่งทำการวิเคราะห์ระหว่างโพรซีเดอร์ที่ใช้ทรัพยากรจำนวนมากของพาธการเรียกใช้โค้ดและกระแสข้อมูลในโปรแกรม โหมดนี้สามารถตรวจจับปัญหาในขั้นตอนการคอมไพล์ เช่น การเรียกใช้ฟังก์ชัน free() สองครั้งสำหรับพื้นที่หน่วยความจำหนึ่ง พื้นที่ตัวอธิบายไฟล์รั่ว การยกเลิกการอ้างอิงและการส่งผ่านพอยน์เตอร์ null การเข้าถึงบล็อกหน่วยความจำที่ว่าง การใช้ค่าที่ไม่ได้เตรียมใช้งาน เป็นต้น การใช้โหมดใหม่สำหรับโค้ด OpenSSL ทำให้สามารถระบุตัวตนได้แล้วความเปราะบางที่เป็นอันตราย . - ปรับปรุงการเพิ่มประสิทธิภาพระหว่างโพรซีเดอร์แล้ว IPA-SRA (Interprocedural Scalar Shared Replacement) ได้รับการออกแบบใหม่เพื่อให้ทำงานในเวลาผูก และเหนือสิ่งอื่นใด ตอนนี้จะลบค่าที่คำนวณแล้วและส่งกลับค่าที่ไม่ได้ใช้ออกไป ในโหมดการปรับให้เหมาะสม "-O2" ตัวเลือก "-finline-functions" จะถูกเปิดใช้งาน ซึ่งได้รับการปรับแต่งใหม่เพื่อให้สนับสนุนโค้ดที่มีขนาดกะทัดรัดมากกว่าประสิทธิภาพการดำเนินการ การทำงานของฮิวริสติกสำหรับการปรับใช้ฟังก์ชันอินไลน์ได้รับการเร่งให้เร็วขึ้น การขยายแบบอินไลน์และการวิเคราะห์พฤติกรรมการโคลนฟังก์ชันสามารถใช้ข้อมูลเกี่ยวกับช่วงค่าเพื่อคาดการณ์ประสิทธิภาพของการแปลงแต่ละรายการได้แล้ว สำหรับ C ++ ความแม่นยำของการแยกวิเคราะห์นามแฝงตามประเภทได้รับการปรับปรุง
- การเพิ่มประสิทธิภาพเวลาการเชื่อมโยงที่ได้รับการปรับปรุง (LTO) เพิ่มปฏิบัติการใหม่แล้ว
lto-ถ่ายโอนข้อมูล เพื่อรีเซ็ตข้อมูลเกี่ยวกับไฟล์อ็อบเจ็กต์ด้วยรหัสไบต์ LTO LTO แบบขนานที่ส่งผ่านจะกำหนดจำนวนของงานสร้างที่ทำงานพร้อมกันโดยอัตโนมัติ และหากไม่สามารถระบุได้ ให้ใช้ข้อมูลเกี่ยวกับจำนวนแกน CPU เป็นปัจจัยในการขนาน เพิ่มความสามารถในการบีบอัดรหัสไบต์ LTO โดยใช้อัลกอริทึม zstd - กลไกการปรับให้เหมาะสมที่สุดตามผลลัพธ์ของโปรไฟล์โค้ด (PGO - การเพิ่มประสิทธิภาพที่แนะนำโดยโปรไฟล์) ได้รับการปรับปรุง ซึ่งสร้างโค้ดที่เหมาะสมที่สุดมากขึ้นโดยอาศัยการวิเคราะห์ลักษณะของการเรียกใช้โค้ด ปรับปรุงการบำรุงรักษาโปรไฟล์ในระหว่างการคอมไพล์และการแยกโค้ดแบบร้อน/เย็น ผ่านตัวเลือก "
-fprofile-ค่า » ขณะนี้สามารถตรวจสอบค่าโปรไฟล์ได้สูงสุด 4 ค่า เช่น การโทรทางอ้อมและการให้ข้อมูลโปรไฟล์ที่แม่นยำยิ่งขึ้น - ข้อกำหนดการเขียนโปรแกรมแบบขนานที่นำไปใช้กับภาษา C, C++ และ Fortran
OpenACC2.6 ซึ่งกำหนดเครื่องมือสำหรับการลดภาระการดำเนินการบน GPU และโปรเซสเซอร์พิเศษ เช่น NVIDIA PTX การดำเนินการตามมาตรฐานนี้ใกล้จะเสร็จสมบูรณ์แล้วเปิด MP 5.0 (Open Multi-Processing) ซึ่งกำหนด API และวิธีการใช้วิธีการเขียนโปรแกรมแบบขนานบนระบบมัลติคอร์และไฮบริด (CPU+GPU/DSP) พร้อมด้วยหน่วยความจำที่ใช้ร่วมกันและหน่วยเวกเตอร์ไดเซชัน (SIMD) เพิ่มคุณสมบัติ เช่น เงื่อนไข Lastprivate, คำสั่งสแกนและวนซ้ำ, นิพจน์ลำดับและ use_device_addr สำหรับ OpenMP และ OpenACC มีการเพิ่มการรองรับสำหรับการดำเนินการถ่ายข้อมูลบน GPU รุ่นที่สี่ (ฟิจิ) และรุ่นที่ห้า AMD Radeon (GCN) (VEGA 10/VEGA 20) - สำหรับภาษาตระกูล C มีการเพิ่มฟังก์ชัน "การเข้าถึง" เพื่ออธิบายการเข้าถึงของฟังก์ชันไปยังวัตถุที่ส่งผ่านโดยการอ้างอิงหรือตัวชี้ และเพื่อเชื่อมโยงวัตถุดังกล่าวกับอาร์กิวเมนต์จำนวนเต็มที่มีข้อมูลเกี่ยวกับขนาดของวัตถุ ในการทำงานร่วมกับ "การเข้าถึง" คุณลักษณะ "ประเภท" จะถูกนำมาใช้เพื่อตรวจจับการเข้าถึงที่ไม่ถูกต้องจากฟังก์ชั่นผู้ใช้เช่นเมื่อเขียนค่าไปยังพื้นที่นอกขอบเขตของอาร์เรย์ ที่เพิ่มเข้ามาคือแอตทริบิวต์ "symver" เพื่อเชื่อมโยงสัญลักษณ์ในไฟล์ ELF ด้วยหมายเลขเวอร์ชันเฉพาะ
- เพิ่มคำเตือนใหม่:
- “ -Wstring-compare” (เปิดใช้งานด้วย“ -Wextra”) - เตือนเกี่ยวกับการมีอยู่ของนิพจน์ที่มีการเปรียบเทียบกับศูนย์กับผลลัพธ์ของการเรียกใช้ฟังก์ชัน strcmp และ strncmp ซึ่งเทียบเท่ากับค่าคงที่เนื่องจากความจริงที่ว่าความยาว ของอาร์กิวเมนต์หนึ่งมีขนาดใหญ่กว่าขนาดของอาร์เรย์ในอาร์กิวเมนต์ที่สอง
- "-Wzero-length-bounds" (เปิดใช้งานด้วย "-Warray-bounds") - เตือนเกี่ยวกับการเข้าถึงองค์ประกอบอาร์เรย์ที่มีความยาวเป็นศูนย์ ซึ่งอาจนำไปสู่การเขียนทับข้อมูลอื่น ๆ
- คำเตือน “-Warray-bounds”, “-Wformat-overflow”, “-Wrestrict”, “-Wreturn-local-addr” และ “-Wstringop-overflow” ได้รับการขยายเพื่อขยายจำนวนสถานการณ์นอกขอบเขต ที่ได้รับการจัดการ
- ใช้ความสามารถในการระบุอักขระเพิ่มเติมในตัวระบุโดยตรงโดยใช้การเข้ารหัสปัจจุบัน (UTF-8 โดยค่าเริ่มต้น) แทนที่จะเป็นรูปแบบ UCN (\uNNNN หรือ \UNNNNNNNN) ตัวอย่างเช่น:
ค่าคงคงที่ int π = 3;
int get_naïve_pi() {
กลับπ;
} - สำหรับภาษา C คุณลักษณะใหม่บางส่วนที่พัฒนาภายในมาตรฐาน C2X ได้ถูกนำมาใช้แล้ว (เปิดใช้งานโดยการระบุ -std=c2x และ -std=gnu2x): การสนับสนุนสำหรับไวยากรณ์ "[[]]" ปรากฏขึ้นเพื่อกำหนดคุณลักษณะเช่นเดียวกับใน C++ (เช่น [[gnu ::const]], [[deprecated]], [[fallthrough]] และ [[maybe_unused]] เพิ่มการรองรับไวยากรณ์ "u8" สำหรับการกำหนดค่าคงที่ด้วยอักขระ UTF-8
เพิ่มมาโครใหม่ให้กับ . เพิ่มการทดแทน "%OB" และ "%Ob" ให้กับ strftime - โหมดเริ่มต้นสำหรับ C คือ "-fno-common" ซึ่งช่วยให้สามารถเข้าถึงตัวแปรทั่วโลกได้อย่างมีประสิทธิภาพมากขึ้นในบางแพลตฟอร์ม
- สำหรับ C++ ได้มีการนำการเปลี่ยนแปลงและนวัตกรรมประมาณ 16 รายการไปใช้ ซึ่งพัฒนาในมาตรฐาน C++20 รวมถึงคำสำคัญที่เพิ่มเข้ามา “constinit”
และรองรับส่วนขยายเทมเพลตแล้ว "แนวคิด ". แนวคิดช่วยให้คุณสามารถกำหนดชุดของข้อกำหนดพารามิเตอร์เทมเพลตที่จำกัดชุดของอาร์กิวเมนต์ที่สามารถยอมรับเป็นพารามิเตอร์เทมเพลตได้ในขณะคอมไพล์ แนวคิดนี้สามารถใช้เพื่อหลีกเลี่ยงความไม่สอดคล้องกันทางลอจิคัลระหว่างคุณสมบัติของชนิดข้อมูลที่ใช้ภายในเทมเพลตและคุณสมบัติชนิดข้อมูลของพารามิเตอร์อินพุต - G++ ให้การตรวจจับพฤติกรรมที่ไม่ได้กำหนดซึ่งเกิดจากการเปลี่ยนแปลงวัตถุคงที่ผ่าน constexpr ลดการใช้หน่วยความจำโดยคอมไพเลอร์เมื่อคำนวณ constexpr เพิ่มคำเตือนใหม่ "-Wmismatched-tags" และ "-Wredundant-tags"
- มีการเสนอตัวเลือกบรรทัดคำสั่งใหม่:
- "-falllocation-dce" เพื่อลบคู่ตัวดำเนินการ "ใหม่" และ "ลบ" ที่ไม่จำเป็น
- "-fprofile-partial-training" เพื่อปิดใช้งานการเพิ่มประสิทธิภาพขนาดสำหรับโค้ดที่ไม่มีการรันการฝึก
- "-fprofile-reproducible เพื่อควบคุมระดับความสามารถในการทำซ้ำโปรไฟล์
- "-fprofile-prefix-path" เพื่อกำหนดไดเร็กทอรีบิลด์ซอร์สฐานที่ใช้สำหรับการสร้างโปรไฟล์แยกกัน (สำหรับ "-fprofile-generate=profile_dir" และ "-fprofile-use=profile_dir")
- ในข้อความคำเตือนสำหรับตัวเลือกดังกล่าว มีไฮเปอร์ลิงก์ที่ให้ไว้เพื่อให้คุณไปที่เอกสารประกอบสำหรับตัวเลือกเหล่านี้ การทดแทน URL ถูกควบคุมโดยใช้ตัวเลือก "-fdiagnostics-urls"
- เพิ่มตัวดำเนินการพรีโปรเซสเซอร์ "
__has_builtin " ซึ่งสามารถใช้เพื่อตรวจสอบฟังก์ชันในตัวได้ - เพิ่มฟังก์ชันในตัวใหม่ "__builtin_roundeven" ด้วยการใช้งานฟังก์ชันการปัดเศษที่กำหนดไว้ในข้อกำหนด ISO/IEC TS 18661 ซึ่งคล้ายกับ "round" แต่การปัดเศษส่วนที่มากกว่า 0.5 ขึ้น (เป็นค่าที่มากขึ้น) น้อยกว่า 0.5 - ลง (เป็นศูนย์) และเท่ากับ 0.5 - เริ่มต้นจากความเท่าเทียมกันของหลักสุดท้าย
- สำหรับสถาปัตยกรรม AArch64 มีการเพิ่มการรองรับส่วนขยาย SVE2 และปรับปรุงการรองรับ SVE (Scalable Vector Extension) รวมถึงเพิ่มการรองรับฟังก์ชันและประเภท SVE ACLE ในตัว และการใช้การทำให้เป็นเวกเตอร์ ขยายการสนับสนุน LSE (Large System Extensions) และ TME (Transactional Memory Extension) แล้ว เพิ่มคำแนะนำใหม่ที่เสนอใน Armv8.5-A และ Armv8.6-A รวมถึงคำแนะนำสำหรับการสร้างตัวเลขสุ่ม การปัดเศษ การผูกแท็กหน่วยความจำ
bfloat16 และการคูณเมทริกซ์ เพิ่มการรองรับโปรเซสเซอร์
แขน Cortex-A77,
แขน Cortex-A76AE,
แขน Cortex-A65,
แขน Cortex-A65AE,
แขน Cortex-A34 และ
มาร์เวลล์ ธันเดอร์เอ็กซ์ 3 - เพิ่มการรองรับ ABI FDPIC (ตัวชี้ฟังก์ชัน 32 บิต) สำหรับ ARM64 ออกแบบใหม่และเพิ่มประสิทธิภาพการประมวลผลการดำเนินการจำนวนเต็ม 64 บิต เพิ่มการรองรับซีพียู
แขน Cortex-A77,
แขน Cortex-A76AE และ
อาร์ม Cortex-M35P. การสนับสนุนเพิ่มเติมสำหรับคำสั่งการประมวลผลข้อมูล ACLE รวมถึง SIMD 32 บิต, การคูณ 16 บิต, เลขคณิต latch และการเพิ่มประสิทธิภาพอัลกอริทึม DSP อื่น ๆ เพิ่มการสนับสนุนการทดลองสำหรับคำแนะนำ ACLE CDE (ส่วนขยาย Datapath แบบกำหนดเอง) - ปรับปรุงการสร้างโค้ดและการทำเวกเตอร์ในแบ็กเอนด์สำหรับ GPU AMD ที่ใช้ GCN microarchitecture ได้ดีขึ้นอย่างมาก
- เพิ่มการรองรับอุปกรณ์ที่คล้าย XMEGA สำหรับสถาปัตยกรรม AVR
ATtiny202, ATtiny204, ATtiny402, ATtiny404, ATtiny406, ATtiny804, ATtiny806, ATtiny807, ATtiny1604, ATtiny1606, ATtiny1607, ATmega808, ATmega809, ATmega1608, ATmega1609, ATmega3208, ATmega3209 4808, ATmega4809 และ ATmegaXNUMX - มีการเพิ่มส่วนขยายสถาปัตยกรรมชุดคำสั่ง Intel ENQCMD ใหม่ (-menqcmd) สำหรับสถาปัตยกรรม IA-32/x86-64 เพิ่มการรองรับ Intel Cooperlake (-march=cooperlake รวมถึงส่วนขยาย AVX512BF16 ISA) และ Tigerlake (-march=tigerlake รวมถึง CPU MOVDIRI, MOVDIR64B และ AVX512VP2INTERSECT ISA)
- การใช้งาน HSAIL (Heterogeneous System Architecture Intermediate Language) สำหรับระบบคอมพิวเตอร์ที่แตกต่างกันซึ่งใช้สถาปัตยกรรม HSA นั้นเลิกใช้แล้ว และมีแนวโน้มว่าจะถูกนำออกในรุ่นต่อๆ ไป
ที่มา: opennet.ru