
ინსტრუქცია vfmaddrnd231pd: Intel SDM-ში დოკუმენტირებული, მაგრამ არასდროს შექმნილი
იდუმალი FMA ინსტრუქცია vfmaddrnd231pd Intel-ის 2024 წლის SDM-ში ჩანს, თუმცა რეალურ ტექნიკაზე განუსაზღვრელი ინსტრუქციის შეცდომას იწვევს. ბლოგის გამოძიება მას მიტოვებულ AVX10 დამრგვალების ექსპერიმენტებამდე მიჰყავს.
მოჩვენება ინსტრუქცია
vfmaddrnd231pd Intel-ის Software Developer's Manual-ში (SDM) FMA ინსტრუქციათა ნაკრების წევრად ჩანს. 2024 წლის გამოცემის მიხედვით, ის შეფუთული ორმაგი სიზუსტის მცურავი წერტილის მნიშვნელობების შერწყმულ გამრავლება-მიმატებას დამრგვალების კონტროლით ასრულებს. ინსტრუქციაზე მიმაგრებული იმედიატ ბაიტი განსაზღვრავს დამრგვალების, DAZ-ის, FTZ-ის და გამონაკლისების ჩახშობის ბიტურ ველებს. ასეთი კონტროლი არითმეტიკულ ოპერაციებს დამრგვალების რეჟიმის პირდაპირ არჩევის საშუალებას მისცემდა, ნელა ცვლადი გლობალური პარამეტრების ნაცვლად, და დამრგვალებაზე დამოკიდებულ ალგორითმებს მნიშვნელოვნად დააჩქარებდა. ოღონდ ეს ინსტრუქცია არ არსებობს.
წარუმატებელი ძიებები და #UD შეცდომა
GNU ასემბლერი vfmaddrnd231pd-ს არ ცნობს. SDM ასახელებს Intel C/C++ Compiler-ის intrinsic-ებს _mm_fmaddround_pd და _mm256_fmaddround_pd, მაგრამ ისინი არა მხოლოდ Clang-ში, არამედ ICC-შიც არ არის. ინსტრუქციის ხელით აწყობა SDM-ის opcode-ების სიიდან, VEX.DDS.128.66.0F3A.W1 B8 /r /ib, კიდევ ერთ კითხვას ბადებს: სახელმძღვანელოში არსად არის ნათქვამი, რას ნიშნავს DDS. Haswell-ის CPU-ზე, რომელიც FMA-ს უჭერს მხარს, ის #UD (განუსაზღვრელი ინსტრუქციის) შეცდომას იწვევს. SDM-ის 2026 წლის გამოცემაში ეს ინსტრუქცია აღარ არის, თუმცა 2024 წლის გამოცემაში არის; არც მისი მონათესავე ვარიანტები, pd, ps, sd, ss ან 132, 213, 231 ფორმები, რომლებიც სხვა FMA ინსტრუქციებს აქვთ.
მიტოვებული AVX10 პროტოტიპი
ბლოგის კომენტარებმა ისტორია შეავსეს. 2023 წელს Intel-მა ტექნიკური შეზღუდვების გამო ვერ დაამატა AVX-512 სამომხმარებლო CPU-ებზე, მაგრამ სურდა AVX-512-ის სტილის ფუნქციები, რამაც AVX10-მდე მიიყვანა. AVX10 AVX-512-ს ჰგავდა, თუმცა 512-ბიტიან ვექტორებს პირობითად უჭერდა მხარს. AVX-512-ის EVEX პრეფიქსში სტატიკური დამრგვალების ბიტები ოპერაციის სიგანეზე გამოიყენება, ამიტომ დამრგვალების მორგება მხოლოდ სკალარულ და 512-ბიტიან ოპერაციებს შეუძლიათ. AVX10-ს 512-ბიტიანი მხარდაჭერის გარეშე სხვა კოდირება სჭირდებოდა. თეორიით, Intel დაგეგმავდა იმედიატ ბაიტს დამრგვალებისთვის, ამიტომ vfmaddrnd231pd და მსგავსი ინსტრუქციები დოკუმენტაციაში მოხვდა. ის VEX პრეფიქსს იყენებს, არა EVEX-ს, რაც 512-ბიტიანი ვექტორების გარეშე CPU-ებს EVEX-ის იგნორირებას აძლევდა. 2024 წლისთვის Intel-მა ეს მიდგომა უარყო და EVEX-ის ბოლო გამოუყენებელი ბიტი 256-ბიტიანი ვექტორების დამრგვალებისთვის გამოიყენა, AVX-512-ის კოდირებითა და სინტაქსით, რამაც vfmaddrnd231pd და მისი მონათესავეები ზედმეტი გახადა. გადამუშავებისას ვიღაცას SDM-ის მონახაზიდან მოჩვენება ინსტრუქციის წაშლა დავიწყებია.
კომპილატორის პატჩები ადასტურებენ ისტორიას
2025 წლისთვის AVX-512 Zen 4-ის პოპულარობის შემდეგ სავალდებულო გახდა და Intel-მა AVX10-ში 512-ბიტიანი მხარდაჭერა უპირობო გახადა. განახლებული AVX10 whitepaper-იდან ამოიღეს 256-ბიტიანი ვექტორული რეგისტრის მაქსიმუმი და 256-ბიტიანი ჩაშენებული დამრგვალების ინსტრუქციები. Intel-მა GCC-ში 256-ბიტიანი დამრგვალების მხარდაჭერის წაშლის პატჩები გაგზავნა, მათ შორის Revert „AVX10.2 ymm rounding: Support vfmadd{132, 231, 213}p{s, d, h} intrins“, რომელმაც წაშალა intrinsic-ები, როგორიცაა _mm256_fmadd_round_pd. ის ძალიან ჰგავს მოჩვენება ინსტრუქციისთვის დოკუმენტირებულ _mm256_fmaddround_pd-ს. მოგვიანებით Intel-ში შენიშნეს, რომ vfmaddrnd231pd ჯერ კიდევ SDM-ში იყო, და წაშალეს. ავტორის შეჯამებით, ინსტრუქცია AVX10-ის შთამომავალია: პროტოტიპირებისას დამატებული, სხვა კოდირებისთვის გადამუშავებული და ბოლოს ზედმეტი, თუმცა შემთხვევით გამოქვეყნებული ოფიციალურ სახელმძღვანელოში, მიუხედავად იმისა, რომ ტექნიკას ის არასდროს დაუნერგავს.
წყაროები: purplesyringa.moe
SiTech — AI-გაძლიერებული ვებ დეველოპმენტი
ვქმნით სწრაფ, თანამედროვე ვებსაიტებს და AI-ს ვაერთიანებთ ქართული ბიზნესებისთვის. გაქვთ პროექტი ან კითხვა? სიამოვნებით დაგეხმარებით.