ความหมายของการเข้าถึงหน่วยความจำแบบ "ไม่ชั่วคราว" ใน x86 คืออะไร


123

นี่เป็นคำถามที่ค่อนข้างต่ำ ในการประกอบ x86 มีคำแนะนำ SSE สองคำสั่ง:

MOVDQA xmmi, m128

และ

MOVNTDQA xmmi, m128

คู่มือสำหรับนักพัฒนาซอฟต์แวร์ IA-32 ระบุว่าNTใน MOVNTDQA ย่อมาจากNon-Temporalและมิฉะนั้นจะเหมือนกับ MOVDQA

คำถามของฉันคือNon-Temporalหมายถึงอะไร?


6
โปรดทราบว่า SSE4.1 MOVNTDQA xmmi, m128เป็นโหลด NT ในขณะที่คำแนะนำ NT อื่น ๆ ทั้งหมดเป็นร้านค้ายกเว้นprefetchnta. คำตอบที่ยอมรับในที่นี้ดูเหมือนจะเป็นการพูดถึงร้านค้าเท่านั้น นี่คือสิ่งที่ฉันสามารถเปิดใช้งานเกี่ยวกับโหลด NTได้ TL: DR: หวังว่า CPU จะมีประโยชน์กับคำใบ้ NT เพื่อลดมลภาวะของแคชให้น้อยที่สุด แต่จะไม่แทนที่ความหมายของหน่วยความจำ WB "ปกติ" ดังนั้นพวกเขาจึงต้องใช้แคช
Peter Cordes

5
อัปเดต: การโหลด NT อาจไม่ทำอะไรที่เป็นประโยชน์ยกเว้นในพื้นที่หน่วยความจำ UCSW บน CPU ส่วนใหญ่ (เช่นตระกูล Intel SnB) ร้านค้า NT / สตรีมมิ่งทำงานบนหน่วยความจำปกติได้อย่างแน่นอน
Peter Cordes

4
@Peter: คุณหมายถึงหน่วยความจำ USWC ใช่ไหม? ฉันไม่เคยได้ยินหน่วยความจำ UCSW หรือ USWC มาก่อน Googling ตัวย่อที่ไม่ถูกต้องไม่มีประโยชน์ :-)
Andrew Bainbridge

4
@AndrewBainbridge: ใช่แอตทริบิวต์ประเภทหน่วยความจำ WC การรวมการเขียนแบบเก็งกำไรที่ไม่สามารถแคชได้ ฉันคิดว่าฉันใช้ตัวพิมพ์ใหญ่ UnCacheable และจำได้ว่ามันควรจะยาว 4 ตัวอักษร : P
Peter Cordes

คำตอบ:


147

คำแนะนำ Non-Temporal SSE (MOVNTI, MOVNTQ ฯลฯ ) ไม่เป็นไปตามกฎการเชื่อมโยงกันของแคชปกติ ดังนั้นร้านค้าที่ไม่ใช่ชั่วคราวจึงต้องปฏิบัติตามด้วยคำสั่ง SFENCE เพื่อให้โปรเซสเซอร์อื่นเห็นผลลัพธ์ได้ทันท่วงที

เมื่อข้อมูลถูกสร้างขึ้นและไม่ได้ใช้ (ทันที) อีกครั้งข้อเท็จจริงที่ว่าการดำเนินการจัดเก็บหน่วยความจำจะอ่านบรรทัดแคชแบบเต็มก่อนจากนั้นจึงแก้ไขข้อมูลแคชจะเป็นอันตรายต่อประสิทธิภาพการทำงาน การดำเนินการนี้จะดึงข้อมูลออกจากแคชซึ่งอาจจำเป็นอีกครั้งเพื่อสนับสนุนข้อมูลซึ่งจะไม่ถูกนำมาใช้ในเร็ว ๆ นี้ โดยเฉพาะอย่างยิ่งสำหรับโครงสร้างข้อมูลขนาดใหญ่เช่นเมทริกซ์ซึ่งถูกเติมแล้วใช้ในภายหลัง ก่อนที่องค์ประกอบสุดท้ายของเมทริกซ์จะเต็มขนาดที่แท้จริงจะขับไล่องค์ประกอบแรกออกไปทำให้การแคชการเขียนไม่ได้ผล

สำหรับสถานการณ์นี้และสถานการณ์ที่คล้ายคลึงกันโปรเซสเซอร์จะให้การสนับสนุนสำหรับการดำเนินการเขียนที่ไม่ใช่ชั่วคราว ไม่ใช่ชั่วคราวในบริบทนี้หมายความว่าข้อมูลจะไม่ถูกนำกลับมาใช้ในเร็ว ๆ นี้ดังนั้นจึงไม่มีเหตุผลที่จะต้องแคช การดำเนินการเขียนที่ไม่ใช่ชั่วคราวเหล่านี้ไม่อ่านบรรทัดแคชแล้วแก้ไข แต่เนื้อหาใหม่จะถูกเขียนลงในหน่วยความจำโดยตรง

ที่มา: http://lwn.net/Articles/255364/


15
คำตอบที่ดีฉันแค่อยากจะชี้ให้เห็นว่าในประเภทของโปรเซสเซอร์ที่มีคำสั่ง NT แม้ว่าจะมีคำสั่งที่ไม่ใช่ชั่วคราว (เช่นคำสั่งปกติ) แคชบรรทัดจะไม่ "อ่านแล้วแก้ไข" สำหรับคำสั่งปกติที่เขียนไปยังบรรทัดที่ไม่ได้อยู่ในแคชบรรทัดจะถูกสงวนไว้ในแคชและมาสก์จะระบุว่าส่วนใดของบรรทัดเป็นข้อมูลล่าสุด หน้าเว็บนี้เรียกมันว่า "แผงลอยไม่มีในร้าน": ptlsim.org/Documentation/html/node30.html ฉันไม่พบข้อมูลอ้างอิงที่แม่นยำกว่านี้ฉันได้ยินเกี่ยวกับเรื่องนี้จากผู้ชายที่มีหน้าที่ใช้เครื่องจำลองโปรเซสเซอร์เท่านั้น
Pascal Cuoq

2
จริงๆแล้วptlsim.orgเป็นเว็บไซต์เกี่ยวกับโปรแกรมจำลองตัวประมวลผลที่ถูกต้องตามวงจรซึ่งเหมือนกับสิ่งที่พวกที่บอกฉันเกี่ยวกับ "ไม่มีแผงขายของในร้าน" กำลังทำอยู่ ฉันควรพูดถึงพวกเขาด้วยในกรณีที่พวกเขาเคยเห็นความคิดเห็นนี้: unisim.org
Pascal Cuoq

1
จากคำตอบและความคิดเห็นที่นี่stackoverflow.com/questions/44864033/…ดูเหมือนว่าSFENCEอาจไม่จำเป็น อย่างน้อยก็ในกระทู้เดียวกัน คุณช่วยดูด้วย?
Serge Rogatch

1
@SergeRogatch ขึ้นอยู่กับสถานการณ์ที่คุณกำลังพูดถึง แต่ใช่มีสถานการณ์ที่sfenceจำเป็นสำหรับร้านค้า NT ในขณะที่ไม่จำเป็นสำหรับร้านค้าทั่วไปเท่านั้น ร้านค้า NT ไม่ได้รับคำสั่งจากร้านค้าอื่น (NT หรือไม่) ตามที่เห็นในหัวข้ออื่น ๆโดยไม่มีsfenceไฟล์. อย่างไรก็ตามสำหรับการอ่านจากเธรดเดียวกันกับร้านค้าคุณไม่จำเป็นต้องsfence: เธรดหนึ่ง ๆ จะเห็นร้านค้าของตัวเองตามลำดับโปรแกรมเสมอไม่ว่าจะเป็นร้าน NT หรือไม่ก็ตาม
BeeOnRope

40

Espo ค่อนข้างปังตามเป้าหมาย แค่อยากจะเพิ่มสองเซ็นต์ของฉัน:

วลี "ไม่ใช่ชั่วคราว" หมายถึงการขาดความเป็นท้องถิ่นชั่วคราว แคชใช้ประโยชน์จากพื้นที่สองประเภทคือเชิงพื้นที่และชั่วคราวและโดยการใช้คำสั่งที่ไม่ใช่ชั่วคราวคุณกำลังส่งสัญญาณไปยังโปรเซสเซอร์ว่าคุณไม่คาดว่าจะมีการใช้รายการข้อมูลในอนาคตอันใกล้

ฉันสงสัยเล็กน้อยเกี่ยวกับแอสเซมบลีรหัสมือที่ใช้คำแนะนำในการควบคุมแคช จากประสบการณ์ของฉันสิ่งเหล่านี้นำไปสู่ข้อบกพร่องที่ชั่วร้ายมากกว่าการเพิ่มประสิทธิภาพใด ๆ


คำถามเกี่ยวกับ "แอสเซมบลีรหัสมือที่ใช้คำแนะนำในการควบคุมแคช" ฉันรู้ว่าคุณพูดอย่างชัดเจนว่า "เขียนด้วยมือ" แล้วอะไรอย่างเช่น JavaVM ใช้กรณีนี้ดีกว่าไหม JavaVM / Compiler ได้วิเคราะห์พฤติกรรมคงที่และไดนามิกของโปรแกรมและใช้คำสั่งที่ไม่ใช่ชั่วคราวเหล่านี้
แพ็ต

4
ไม่ควรหลีกเลี่ยงการใช้ประโยชน์จากคุณสมบัติท้องถิ่นที่เป็นที่รู้จัก (หรือไม่มี) ของโดเมนปัญหาอัลกอริทึมหรือแอปพลิเคชันของคุณ การหลีกเลี่ยงมลภาวะจากแคชถือเป็นงานเพิ่มประสิทธิภาพที่น่าดึงดูดและมีประสิทธิภาพ นอกจากนี้เหตุใดจึงเกลียดชังการชุมนุม? มีโอกาสมากมายที่จะได้รับซึ่งคอมไพเลอร์ไม่สามารถใช้ประโยชน์จาก
awdz9nld ได้

5
แน่นอนว่าโปรแกรมเมอร์ระดับต่ำที่มีความรู้สามารถทำได้ดีกว่าคอมไพเลอร์สำหรับเมล็ดข้าวขนาดเล็ก สิ่งนี้ยอดเยี่ยมสำหรับการเผยแพร่เอกสารและโพสต์บล็อกและฉันได้ทำทั้งสองอย่างแล้ว นอกจากนี้ยังเป็นเครื่องมือการสอนที่ดีและช่วยให้เข้าใจว่าเกิดอะไรขึ้น จากประสบการณ์ของฉันในทางปฏิบัติซึ่งคุณมีระบบจริงที่มีโปรแกรมเมอร์จำนวนมากทำงานอยู่และความถูกต้องและการบำรุงรักษาเป็นสิ่งสำคัญประโยชน์ของการเข้ารหัสระดับต่ำนั้นมักจะมีมากกว่าความเสี่ยง
ปราโมทย์

4
@Pramod ข้อโต้แย้งเดียวกันนั้นทำให้เกิดการเพิ่มประสิทธิภาพโดยทั่วไปได้ง่ายและไม่ได้อยู่ในขอบเขตของการสนทนา - ชัดเจนว่าการแลกเปลี่ยนได้รับการพิจารณาแล้วหรือถือว่าไม่เกี่ยวข้องเนื่องจากเรากำลังพูดถึงคำแนะนำที่ไม่ใช่ชั่วคราวอยู่แล้ว
awdz9nld

7

ตามคู่มือสำหรับนักพัฒนาซอฟต์แวร์สถาปัตยกรรมIntel® 64 และ IA-32 เล่ม 1: สถาปัตยกรรมพื้นฐานบท "การเขียนโปรแกรมด้วย Intel Streaming SIMD Extensions (Intel SSE)":

การแคชข้อมูลชั่วคราวกับข้อมูลที่ไม่ใช่ชั่วคราว

ข้อมูลที่อ้างอิงโดยโปรแกรมอาจเป็นข้อมูลชั่วคราว (ข้อมูลจะถูกใช้อีกครั้ง) หรือไม่ใช่ชั่วคราว (ข้อมูลจะถูกอ้างอิงเพียงครั้งเดียวและจะไม่ถูกนำมาใช้ซ้ำในอนาคตอันใกล้) ตัวอย่างเช่นรหัสโปรแกรมโดยทั่วไปมักเป็นแบบชั่วคราวในขณะที่ข้อมูลมัลติมีเดียเช่นรายการที่แสดงในแอปพลิเคชันกราฟิก 3 มิติมักไม่เป็นแบบชั่วคราว เพื่อให้สามารถใช้แคชของโปรเซสเซอร์ได้อย่างมีประสิทธิภาพโดยทั่วไปควรแคชข้อมูลชั่วคราวและไม่แคชข้อมูลที่ไม่ใช่ชั่วคราว การโอเวอร์โหลดแคชของโปรเซสเซอร์ด้วยข้อมูลที่ไม่ใช่ชั่วคราวบางครั้งเรียกว่า "การทำให้แคชเป็นมลพิษ" คำแนะนำในการควบคุมความสามารถในการแคช SSE และ SSE2 ช่วยให้โปรแกรมสามารถเขียนข้อมูลที่ไม่ใช่ชั่วคราวไปยังหน่วยความจำในลักษณะที่ลดมลพิษของแคช

คำอธิบายเกี่ยวกับโหลดที่ไม่ใช่ชั่วคราวและคำแนะนำในการจัดเก็บ ที่มา: คู่มือสำหรับนักพัฒนาซอฟต์แวร์สถาปัตยกรรม Intel 64 และ IA-32 เล่ม 2: การอ้างอิงชุดคำสั่ง

โหลด (MOVNTDQA - โหลดคำใบ้คำแนะนำสองคำที่ไม่ใช่ชั่วคราว)

โหลดคำสี่คำคู่จากตัวถูกดำเนินการต้นทาง (ตัวถูกดำเนินการที่สอง) ไปยังตัวถูกดำเนินการปลายทาง (ตัวถูกดำเนินการตัวแรก) โดยใช้คำใบ้ที่ไม่ใช่ชั่วคราวหากแหล่งหน่วยความจำเป็นประเภทหน่วยความจำ WC (การเขียนรวม) [... ]

[... ] โปรเซสเซอร์ไม่อ่านข้อมูลในลำดับชั้นของแคชและไม่ดึงข้อมูลแคชที่เกี่ยวข้องจากหน่วยความจำไปยังลำดับชั้นของแคช

โปรดทราบว่าตามที่ Peter Cordes แสดงความคิดเห็นจะไม่มีประโยชน์กับหน่วยความจำ WB (การเขียนกลับ) ปกติในโปรเซสเซอร์ปัจจุบันเนื่องจากคำใบ้ NT ถูกละเว้น (อาจเป็นเพราะไม่มีตัวตั้งค่าล่วงหน้า HW ที่รับรู้ NT) และใช้ความหมายของโหลดที่สั่งซื้ออย่างเข้มงวดเต็มรูปแบบ . prefetchntaสามารถใช้เป็นภาระลดมลพิษจากหน่วยความจำ WB

ร้านค้า (MOVNTDQ - จัดเก็บจำนวนเต็มโดยใช้คำแนะนำที่ไม่ใช่ชั่วคราว)

ย้ายจำนวนเต็มที่บรรจุในตัวถูกดำเนินการต้นทาง (ตัวถูกดำเนินการที่สอง) ไปยังตัวถูกดำเนินการปลายทาง (ตัวถูกดำเนินการตัวแรก) โดยใช้คำใบ้ที่ไม่ใช่ชั่วคราวเพื่อป้องกันการแคชข้อมูลระหว่างการเขียนไปยังหน่วยความจำ

[... ] โปรเซสเซอร์ไม่ได้เขียนข้อมูลลงในลำดับชั้นของแคชและไม่ดึงบรรทัดแคชที่เกี่ยวข้องจากหน่วยความจำไปยังลำดับชั้นของแคช

การใช้คำศัพท์ที่กำหนดไว้ใน นโยบายและประสิทธิภาพการเขียนแคชจึงถือได้ว่าเป็นการเขียนรอบ ๆ (ไม่เขียนจัดสรรไม่ดึงข้อมูลเมื่อเขียนพลาด)

สุดท้ายมันอาจจะเป็นที่น่าสนใจในการตรวจสอบบันทึกจอห์น McAlpin เกี่ยวกับร้านค้าที่ไม่ได้ชั่วขณะ


3
SSE4.1 ทำMOVNTDQAเฉพาะสิ่งพิเศษบนพื้นที่หน่วยความจำ WC (Uncacheable Write-Combining) เช่นแรมวิดีโอ มันไม่มีประโยชน์เลยในหน่วยความจำ WB (การเขียนกลับ) ปกติบน HW ปัจจุบันคำใบ้ NT จะถูกละเว้นและใช้ความหมายของโหลดที่ได้รับคำสั่งแบบเต็ม prefetchntaแม้ว่าจะมีประโยชน์ในฐานะที่ช่วยลดภาระมลพิษจากหน่วยความจำ WB สถาปัตยกรรม x86 ปัจจุบันรองรับการโหลดที่ไม่ใช่ชั่วคราว (จากหน่วยความจำ "ปกติ") หรือไม่ .
Peter Cordes

2
ถูกต้องร้านค้า NT ทำงานได้ดีบนหน่วยความจำ WB และได้รับคำสั่งอย่างอ่อนและมักเป็นทางเลือกที่ดีสำหรับการเขียนพื้นที่หน่วยความจำขนาดใหญ่ แต่ไม่โหลด NT คู่มือ x86 บนกระดาษช่วยให้คำใบ้ NT ทำอะไรบางอย่างสำหรับการโหลดจากหน่วยความจำ WB แต่ใน CPU ปัจจุบันจะไม่ทำอะไรเลย (อาจเป็นเพราะไม่มีตัวตั้งค่าล่วงหน้า HW ที่รับรู้ระบบ NT)
Peter Cordes

ฉันได้เพิ่มข้อมูลที่เกี่ยวข้องลงในคำตอบแล้ว ขอบคุณมาก.
chus

1
@LewisKelsey: ร้านค้า NT จะแทนที่ประเภทหน่วยความจำ นั่นเป็นเหตุผลที่พวกเขาสามารถสั่งซื้อหน่วยความจำ WB ได้อย่างอ่อน ผลกระทบที่สำคัญคือการหลีกเลี่ยง RFO (เห็นได้ชัดว่าพวกเขาส่งสัญญาณที่ไม่ถูกต้องซึ่งแม้จะล้างเส้นสกปรกอื่น ๆ เมื่อถึง mem) นอกจากนี้ยังสามารถมองเห็นไม่อยู่ในลำดับได้ดังนั้นพวกเขาจึงไม่ต้องรอจนกว่าจะมีการคอมมิตแคชก่อนหน้านี้ (ปกติ) หรือจนกว่าการโหลดแคชก่อนหน้านี้จะได้รับข้อมูล กล่าวคือชนิดของคอขวดที่ถามเกี่ยวกับหน่วยความจำที่อยู่นอกคอร์แต่ละคอร์มักจะแบน / สม่ำเสมอ / ซิงโครนัสในระบบมัลติโปรเซสเซอร์หรือไม่? .
Peter Cordes

1
@LewisKelsey: เครื่องสั่งซื้อหน่วยความจำที่ชัดเจนสามารถฆ่าโหลดใด ๆ จากร้าน UC ที่ไม่ควรทำก่อนเวลาอันควรหากจำเป็น นอกเหนือจากนั้นคำสั่งคอมมิตจะไม่เข้ามาเล่นจนกว่าร้านค้าจะออกจากแบ็คเอนด์ที่ไม่ได้รับคำสั่ง สิ่งนี้ไม่สามารถเกิดขึ้นได้จนกว่าจะดำเนินการ uop ที่อยู่ร้านค้าซึ่ง ณ จุดนี้สามารถตรวจสอบประเภทหน่วยความจำสำหรับที่อยู่ได้ uop ที่อยู่ร้านค้าจะตรวจสอบ TLB เมื่อดำเนินการ นั่นคือวิธีที่ซีพียูสามารถตรวจจับร้านค้าที่ผิดพลาดก่อนที่จะเลิกใช้งาน ไม่สามารถรอจนกว่ารายการ SB จะพร้อมที่จะส่งไปยัง L1d ณ จุดนั้นการดำเนินการจะผ่านไปแล้ว
Peter Cordes
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.