คุณจะแทรก NaN ลงในทะเบียน xmm ได้อย่างไร?


9

สำหรับฟังก์ชั่นที่ฉันเขียนฉันต้องการคืนน่านถ้าอินพุตไม่สมเหตุสมผล

ฉันจะใส่ NaN ลงใน xmm register ได้อย่างไร?


1
คุณจะกำหนดว่า "การป้อนข้อมูลที่ไม่สมเหตุสมผล" ได้อย่างไร หากนี่คือผลลัพธ์ของการเปรียบเทียบคุณสามารถเพียงบิตหรือ - ผลลัพธ์ "ปกติ" ของคุณพร้อมมาส์กผลลัพธ์ของการเปรียบเทียบ
chtz

คำตอบ:


13

ทุกคนเป็นความเงียบ (ไม่ใช่การส่งสัญญาณ, ปกติ) NaN, ซึ่งเป็นสิ่งที่คุณต้องการ วิธีที่ง่ายที่สุดในการผลิตหนึ่งอยู่กับ SSE2 pcmpeqd xmm0,xmm0การตั้งค่าทุกบิตในการลงทะเบียนไป1คือ 2 -1จำนวนเต็มสมบูรณ์ ( ตั้งค่าบิตทั้งหมดใน CPU register 1 อย่างมีประสิทธิภาพ / ลำดับการเรียนการสอนที่ดีที่สุดในการสร้างค่าคงที่แบบเวกเตอร์คือเท่าใด )

อันที่จริงแล้วมันคือ-NaN- เครื่องหมายบิตถูกตั้งค่า พิจารณาการเลื่อนขวาจำนวนเต็ม ( psrld xmm0,1) หรือหารด้วยศูนย์ / ศูนย์ ( xorps xmm0,xmm0/ divpd xmm0,xmm0) หากไม่พึงประสงค์


ฟังก์ชันทางคณิตศาสตร์ที่ต้องการส่งกลับ NaN มักต้องการตรวจสอบให้แน่ใจว่าบิตข้อผิดพลาดที่ไม่ถูกต้องของ FP ได้รับการตั้งค่าใน MXCSR (หรือยกข้อยกเว้นจริง ๆ ถ้าผู้โทรของคุณเปิดโปงข้อยกเว้นนั้น) ในการทำเช่นนั้นคุณสามารถคูณหรือเพิ่ม NaN ด้วยตัวเองได้ เช่น

    ...
.error_return_path:
    pcmpeqd   xmm0, xmm0
    mulsd     xmm0, xmm0       ; Cause an FP-invalid operation.
    ret

หรือmulssเพื่อความแม่นยำfloatเดียว mulpd/ mulpsก็จะมีความเหมาะสม

รูปแบบบิตสำหรับการคูณหรือการเพิ่มของ NaN กับ NaN ยังคงเป็น NaN แน่นอนและควรยังคงเป็นส่วนของข้อมูลเดียวกันดังนั้นจึงยังคงอยู่ทั้งหมด

การมีค่าส่งคืนเป็นผลมาจากmulsdหรือaddsd(หรือdivsd) ยังมีข้อได้เปรียบว่าหากผู้เรียกใช้ที่ลงทะเบียนซ้ำ ๆ ในลูปนั้นจะไม่มีความล่าช้าบายพาสข้ามโดเมน (สำหรับตระกูล Sandybridge สิ่งนี้จะคงอยู่ตลอดไปเช่นทุกรอบaddsd xmm1, xmm0จะมีวงจรแฝงเพิ่มเติมจากอินพุต xmm1 ไปยังเอาต์พุต xmm1 หาก xmm0 มาจากpcmpeqdแม้ว่าจะเป็นเมื่อนานมาแล้วและจำนวนเต็ม-SIMD uop ได้เลิกใช้ไปแล้ว)


คุณอาจสามารถทำได้โดยไม่ไร้สาระหากคุณใช้cmpsdหรือcmppdคุณสามารถorpsใส่หน้ากาก 0 / -1 ลงในผลลัพธ์เพื่อให้เป็น NaN หรือไม่เปลี่ยนแปลง หากการคำนวณอื่น ๆ จะ (หรือมีอยู่แล้ว) จะตั้งค่าสถานะที่ไม่ถูกต้องของ FP หรือหากคุณไม่สนใจสิ่งนั้นคุณก็พร้อมแล้ว

ระวังการยืดเส้นทางสำคัญให้ยาวขึ้นด้วย cmp พิเศษ / หรือ; หากคุณคาดว่าจะหายากสุด ๆ คุณอาจเปรียบเทียบและแยกสาขาเช่นกับmovmskpd/ test eax,eax/ jnzในผลการค้นหาด้วย cmppd เพื่อดูว่ามีการตั้งค่าบิตทั้งสอง => หนึ่งในองค์ประกอบ SIMD ที่ล้มเหลวในการตรวจสอบบางอย่าง

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.