โปรเซสเซอร์ Intel ล่าสุดจำนวนมากได้รับประโยชน์จากชุดคำสั่งใหม่ที่เรียกว่า AVX-512 คำแนะนำเหล่านี้ทำงานบนรีจิสเตอร์กว้าง (สูงสุด 512 บิต) และปฏิบัติตาม กระบวนทัศน์คำสั่งเดียว หลายข้อมูล (SIMD) คำแนะนำ AVX-512 ใหม่เหล่านี้ทำให้คุณสามารถทำลายสถิติความเร็วบางอย่างได้ เช่น การถอดรหัสข้อมูล base64 ด้วย ความเร็วของการคัดลอกหน่วยความจำ
โปรเซสเซอร์ที่ทันสมัยส่วนใหญ่มีคำสั่ง SIMD คำสั่ง AVX-512 นั้นกว้างกว่า (จำนวนบิตมากขึ้นต่อการลงทะเบียน) แต่นั่นก็ไม่จำเป็นว่าจะต้องดึงดูดใจหลัก หากคุณเพียงแค่ใช้อัลกอริธึม SIMD ที่มีอยู่และนำไปใช้กับ AVX-512 คุณอาจไม่ได้รับประโยชน์มากเท่าที่คุณต้องการ เป็นความจริงที่การลงทะเบียนที่กว้างขึ้นนั้นมีประโยชน์ แต่ในโปรเซสเซอร์ superscalar (โปรเซสเซอร์ที่สามารถออกคำสั่งได้หลายคำสั่งต่อรอบ) จำนวนคำสั่งที่คุณสามารถออกต่อรอบมีความสำคัญมากถ้าไม่มาก โดยทั่วไปแล้ว คำสั่ง AVX-512 แบบ 512 บิตจะมีราคาแพงกว่า และโปรเซสเซอร์สามารถออกคำสั่งเหล่านี้ได้น้อยลงต่อรอบ เพื่อให้ได้รับประโยชน์อย่างเต็มที่จาก AVX-512 คุณต้องออกแบบโค้ดของคุณอย่างระมัดระวัง การที่ Intel กำลังเผยแพร่คำสั่งเหล่านี้อย่างค่อยเป็นค่อยไปทำให้มีความท้าทายมากขึ้น: โปรเซสเซอร์ล่าสุดมีคำสั่ง AVX-512 อันทรงพลังใหม่จำนวนมากซึ่งไม่สามารถใช้งานได้ในตอนแรก ดังนั้น AVX-512 จึงไม่ใช่ “สิ่งเดียว” แต่เป็นชุดคำสั่งในตระกูล
นอกจากนี้ การปรับใช้คำสั่ง AVX-512 ในระยะแรกมักจะนำไปสู่การดาวน์คล็อกที่วัดได้: โปรเซสเซอร์จะลดความถี่ลงชั่วขณะหนึ่งหลังจากใช้คำแนะนำเหล่านี้ โชคดีที่โปรเซสเซอร์ Intel รุ่นล่าสุดที่สนับสนุน AVX-512 (Rocket Lake และ Ice Lake) ได้ยุติการควบคุมความถี่ที่เป็นระบบ นี้ โชคดีที่ตรวจพบโปรเซสเซอร์ล่าสุดเหล่านี้ได้ง่ายในขณะใช้งานจริง
เซิร์ฟเวอร์ Intel อันทรงพลังของ Amazon นั้นใช้ Ice Lake ดังนั้น หากคุณกำลังปรับใช้ซอฟต์แวร์แอปพลิเคชันของคุณกับคลาวด์บนเซิร์ฟเวอร์ที่ทรงพลัง แสดงว่าคุณอาจได้รับการสนับสนุนที่ดีสำหรับ AVX-512 แล้ว !
ไม่กี่ปีที่ผ่านมา เราได้เปิดตัว ตัวแยกวิเคราะห์ C++ JSON ที่เร็วจริงๆ ชื่อ simdjson ตัวแยกวิเคราะห์ค่อนข้างพิเศษเนื่องจากต้องอาศัยคำแนะนำ SIMD อย่างยิ่ง ในหลาย ๆ ตัวชี้วัด ตัวแยกวิเคราะห์ JSON นั้นเคยเป็นและยังคงเป็นตัวแยกวิเคราะห์ JSON ที่เร็วที่สุด แม้ว่าจะมีคู่แข่งที่น่าสนใจรายอื่นๆ เกิดขึ้น
ตอนแรกฉันได้เขียนเคอร์เนล AVX-512 ที่รวดเร็วและสกปรกสำหรับ simdjson เราไม่เคยรวมมันเข้าด้วยกันและหลังจากนั้นไม่นานฉันก็ลบมันทิ้งไป แล้วฉันก็ลืมมันไป
ขอบคุณการมีส่วนร่วมจากวิศวกรของ Intel มากความสามารถ (Fangzheng Zhang และ Weiqiang Wan) รวมถึงการมีส่วนร่วมทางอ้อมจากผู้อ่านบล็อกนี้ (Kim Walisch และ Jatin Bhateja) เราจึงผลิตเคอร์เนล AVX-512 ใหม่ขึ้นมา และเช่นเคย โปรดจำไว้ว่า simdjson เป็นผลงานของคนจำนวนมาก ซึ่งเป็นชุมชนทั้งหมดที่มีผู้มีส่วนร่วมหลายสิบคน ฉันต้องแสดงความขอบคุณต่อ Fangzheng Zhang ที่เขียนถึงฉันเกี่ยวกับพอร์ต AVX-512 ก่อน
เราเพิ่งเปิดตัวในเวอร์ชันล่าสุดของ simdjson มันทำลายสถิติความเร็วใหม่
ให้เราพิจารณาการทดสอบที่น่าสนใจที่คุณต้องการสแกนทั้งไฟล์ (ขนาดกิโลไบต์) เพื่อค้นหาค่าที่สอดคล้องกับตัวระบุบางตัว ใน simdjson รหัสมีดังนี้:
auto doc = parser . วนซ้ำ ( json ) ; สำหรับ ( ทวีต อัตโนมัติ : doc . find_field ( " สถานะ " ) ) { if ( uint64_t ( ทวีต . find_field ( " id " ) ) = = find_id ) { ผลลัพธ์ = ทวี ต find_field ( " ข้อความ " ) ; คืนค่า จริง ; } } คืนค่า เท็จ ;
บนโปรเซสเซอร์ Tiger Lake ด้วย GCC 11 ฉันได้รับความเร็วในการประมวลผลเป็นสองเท่า โดยแสดงด้วยจำนวนไบต์อินพุตที่ประมวลผลต่อวินาที
simdjson (512-bit SIMD): ใหม่ | 7.4 GB/วินาที |
simdjson (256 บิต SIMD): เก่า | 4.6 GB/วินาที |
ความเร็วที่เพิ่มขึ้นนั้นสำคัญมากเพราะในงานนี้ เรามักจะอ่านข้อมูลเป็นหลัก และประมวลผลรองค่อนข้างน้อย เราไม่ได้สร้างต้นไม้จากข้อมูล JSON เราไม่ได้สร้างโครงสร้างข้อมูล
ไลบรารี simdjson มีฟังก์ชันย่อขนาดซึ่งเพิ่งตัดช่องว่างที่ไม่จำเป็นออกจากอินพุต อาจเป็นเรื่องน่าประหลาดใจที่เราเร็วกว่าสองเท่าของค่าพื้นฐานก่อนหน้า:
simdjson (512-bit SIMD): ใหม่ | 12 GB/วินาที |
simdjson (256 บิต SIMD): เก่า | 4.3 GB/วินาที |
เกณฑ์มาตรฐานที่สมเหตุสมผลอีกประการหนึ่งคือการแยกวิเคราะห์อินพุตลงในแผนผัง DOM ด้วยการตรวจสอบแบบเต็ม การแยกวิเคราะห์ไฟล์ JSON มาตรฐาน ( twitter.json ) ฉันได้รับเกือบ 30%:
simdjson (512-bit SIMD): ใหม่ | 3.6 GB/วินาที |
simdjson (256 บิต SIMD): เก่า | 2.8 GB/วินาที |
แม้ว่า 30% อาจฟังดูไม่น่าตื่นเต้น แต่เราเริ่มต้นจากเส้นฐานที่รวดเร็ว
เราทำได้ดีกว่านี้ไหม? ได้อย่างมั่นใจ มี AVX-512 มากมายที่เรายังไม่ได้ใช้งาน เราไม่ใช้การดำเนินการบูลีนแบบไตรภาค ( vpternlog ) เราไม่ได้ใช้ฟังก์ชันสับเปลี่ยนอันทรงพลังใหม่ (เช่น vpermt2b ) เรามีตัวอย่างของวิวัฒนาการร่วมกัน: ฮาร์ดแวร์ที่ดีกว่าต้องการซอฟต์แวร์ใหม่ ซึ่งจะทำให้ฮาร์ดแวร์มีความโดดเด่น
แน่นอน เพื่อให้ได้ประโยชน์ใหม่เหล่านี้ คุณต้องมีโปรเซสเซอร์ Intel รุ่นล่าสุดที่มีการรองรับ AVX-512 ที่เพียงพอ และแน่นอนว่าคุณต้องมีโปรเซสเซอร์ C++ ที่ค่อนข้างใหม่ด้วยเช่นกัน โปรเซสเซอร์ Intel ระดับแล็ปท็อปรุ่นล่าสุดบางตัวไม่รองรับ AVX-512 แต่คุณน่าจะใช้ได้หากคุณพึ่งพา AWS และมีโหนด Intel ขนาดใหญ่
คุณสามารถคว้า รุ่นของเราได้โดยตรง หรือรอให้มันไปถึงหนึ่งในตัวจัดการแพ็คเกจมาตรฐาน (MSYS2, conan, vcpkg, brew, debian, FreeBSD เป็นต้น)