แคชอยู่ที่นั่นเพื่อลดจำนวนครั้งที่ CPU จะหยุดรอการร้องขอหน่วยความจำที่จะปฏิบัติตาม (หลีกเลี่ยงการหน่วงเวลาหน่วยความจำ) และเป็นผลที่สองอาจเป็นไปได้ที่จะลดปริมาณข้อมูลโดยรวมที่ต้องถ่ายโอนแบนด์วิดธ์หน่วยความจำ)
เทคนิคในการหลีกเลี่ยงความทุกข์จากการดึงข้อมูลหน่วยความจำโดยทั่วไปเป็นสิ่งแรกที่ต้องพิจารณาและบางครั้งก็ช่วยได้นาน แบนด์วิดท์หน่วยความจำที่ จำกัด ยังเป็นปัจจัย จำกัด โดยเฉพาะอย่างยิ่งสำหรับแอพพลิเคชั่นมัลติคอร์และมัลติเธรดที่หลายเธรดต้องการใช้บัสหน่วยความจำ ชุดเทคนิคที่แตกต่างช่วยแก้ไขปัญหาหลัง
การปรับปรุงตำแหน่งเชิงพื้นที่หมายความว่าคุณมั่นใจได้ว่าแต่ละบรรทัดแคชถูกใช้อย่างเต็มรูปแบบเมื่อถูกแมปไปยังแคชแล้ว เมื่อเราดูมาตรฐานมาตรฐานต่างๆเราพบว่ามีเศษส่วนขนาดใหญ่ที่น่าประหลาดใจที่ล้มเหลวในการใช้แคชแคชที่ดึงมาได้ 100% ก่อนที่จะมีการแคชบรรทัด
การปรับปรุงการใช้งานแคชบรรทัดช่วยในสามประการ:
- มันมีแนวโน้มที่จะพอดีกับข้อมูลที่เป็นประโยชน์มากขึ้นในแคชเพิ่มขนาดแคชที่มีประสิทธิภาพเป็นหลัก
- มันมีแนวโน้มที่จะพอดีกับข้อมูลที่เป็นประโยชน์มากขึ้นในบรรทัดแคชเดียวกันเพิ่มโอกาสที่ข้อมูลที่ร้องขอสามารถพบได้ในแคช
- จะลดข้อกำหนดแบนด์วิดท์หน่วยความจำเนื่องจากจะมีการดึงข้อมูลน้อยลง
เทคนิคทั่วไปคือ:
- ใช้ประเภทข้อมูลที่เล็กลง
- จัดระเบียบข้อมูลของคุณเพื่อหลีกเลี่ยงการจัดตำแหน่งหลุม (การเรียงลำดับสมาชิก struct ของคุณโดยการลดขนาดเป็นวิธีหนึ่ง)
- ระวังตัวจัดสรรหน่วยความจำแบบไดนามิกมาตรฐานซึ่งอาจทำให้เกิดช่องโหว่และกระจายข้อมูลของคุณในหน่วยความจำเมื่อมันอุ่นขึ้น
- ตรวจสอบให้แน่ใจว่ามีการใช้ข้อมูลที่อยู่ติดกันทั้งหมดใน hot loops มิฉะนั้นให้พิจารณาแบ่งโครงสร้างข้อมูลออกเป็นส่วนประกอบที่ร้อนและเย็นเพื่อให้ลูปฮอตใช้ข้อมูลร้อน
- หลีกเลี่ยงอัลกอริทึมและโครงสร้างข้อมูลที่แสดงรูปแบบการเข้าถึงที่ผิดปกติและสนับสนุนโครงสร้างข้อมูลเชิงเส้น
เราควรทราบด้วยว่ามีวิธีอื่นในการซ่อนเวลาแฝงของหน่วยความจำมากกว่าการใช้แคช
CPU สมัยใหม่: มักจะมีตัวดึงข้อมูลฮาร์ดแวร์อย่างน้อยหนึ่งรายการ พวกเขาฝึกฝนเกี่ยวกับการพลาดท่าในแคชและพยายามมองเห็นระเบียบ ตัวอย่างเช่นหลังจากพลาดไปที่แคชบรรทัดถัดไป hw prefetcher จะเริ่มดึงข้อมูลแคชลงในแคชเพื่อคาดการณ์ความต้องการของแอปพลิเคชัน หากคุณมีรูปแบบการเข้าถึงปกติ prefetcher ฮาร์ดแวร์มักจะทำงานได้ดีมาก และหากโปรแกรมของคุณไม่แสดงรูปแบบการเข้าถึงปกติคุณอาจปรับปรุงสิ่งต่าง ๆ โดยเพิ่มคำแนะนำ prefetchด้วยตัวคุณเอง
การจัดกลุ่มคำแนะนำในลักษณะที่ว่าผู้ที่มักจะพลาดในแคชเกิดขึ้นใกล้กับแต่ละอื่น ๆ , CPU สามารถบางครั้งซ้อนทับกันการดึงข้อมูลเหล่านี้เพื่อให้แอพลิเคชันเพียงรักษาหนึ่งแฝงตี ( หน่วยความจำระดับขนาน )
เพื่อลดความดันบัสหน่วยความจำโดยรวมคุณต้องเริ่มต้นจัดการกับสิ่งที่เรียกว่าสถานที่ทางโลก ซึ่งหมายความว่าคุณต้องใช้ข้อมูลซ้ำในขณะที่ยังไม่ถูกขับไล่ออกจากแคช
การผสานลูปที่สัมผัสกับข้อมูลเดียวกัน (การรวมแบบวนซ้ำ ) และใช้เทคนิคการเขียนใหม่ที่รู้จักกันในชื่อการเรียงต่อกันหรือการบล็อกทั้งหมดพยายามหลีกเลี่ยงการดึงหน่วยความจำเพิ่มเติม
ในขณะที่มีกฎบางอย่างสำหรับการเขียนแบบฝึกหัดนี้โดยทั่วไปคุณจะต้องพิจารณาการพึ่งพาข้อมูลที่มีการวนซ้ำอย่างระมัดระวังเพื่อให้แน่ใจว่าคุณจะไม่ส่งผลกระทบต่อความหมายของโปรแกรม
สิ่งเหล่านี้คือสิ่งที่จ่ายจริง ๆ ในโลกของมัลติคอร์ซึ่งโดยทั่วไปคุณจะไม่เห็นการปรับปรุงของปริมาณงานมากหลังจากเพิ่มเธรดที่สอง