สิ่งนี้อาจเกี่ยวข้องกับความขัดแย้งในแคช L2 ของคุณ
แคชที่ไม่มีบน matice1 ไม่ใช่ปัญหาเนื่องจากมีการเข้าถึงตามลำดับ อย่างไรก็ตามสำหรับ matice2 ถ้าคอลัมน์เต็มพอดีกับ L2 (เช่นเมื่อคุณเข้าถึง matice2 [0, 0], matice2 [1, 0], matice2 [2, 0] ... ฯลฯ ไม่มีอะไรถูกขับไล่) กว่าจะไม่มีปัญหา แคชพลาดกับ matice2 อย่างใดอย่างหนึ่ง
ตอนนี้เพื่อดูรายละเอียดวิธีการทำงานของแคชหากไบต์แอดเดรสของตัวแปรของคุณคือ X กว่าบรรทัดแคชจะเป็น (X >> 6) & (L - 1) โดยที่ L คือจำนวนบรรทัดแคชทั้งหมดในแคชของคุณ L คือกำลัง 2 เสมอหกมาจากข้อเท็จจริงที่ว่า 2 ^ 6 == 64 ไบต์คือขนาดมาตรฐานของแคชไลน์
ตอนนี้หมายความว่าอย่างไร? หมายความว่าถ้าฉันมีที่อยู่ X และที่อยู่ Y และ (X >> 6) - (Y >> 6) หารด้วย L ได้ (เช่นกำลังใหญ่ของ 2) พวกมันจะถูกเก็บไว้ในแคชไลน์เดียวกัน
ตอนนี้กลับไปที่ปัญหาของคุณว่าอะไรคือความแตกต่างระหว่างปี 2048 และ 2049
เมื่อ 2048 คือขนาดของคุณ:
ถ้าคุณเอา & matice2 [x, k] และ & matice2 [y, k] ผลต่าง (& matice2 [x, k] >> 6) - (& matice2 [y, k] >> 6) จะหารด้วย 2048 * 4 (ขนาด ลอย) พลังมหาศาลของ 2
ดังนั้นขึ้นอยู่กับขนาดของ L2 ของคุณคุณจะมีความขัดแย้งในบรรทัดแคชจำนวนมากและใช้เพียงส่วนเล็ก ๆ ของ L2 ของคุณในการจัดเก็บคอลัมน์ดังนั้นคุณจะไม่สามารถจัดเก็บคอลัมน์แบบเต็มในแคชของคุณได้ดังนั้นคุณจะได้รับประสิทธิภาพที่ไม่ดี .
เมื่อขนาดคือ 2049 ความแตกต่างคือ 2049 * 4 ซึ่งไม่ใช่กำลัง 2 ดังนั้นคุณจะมีความขัดแย้งน้อยลงและคอลัมน์ของคุณจะพอดีกับแคชของคุณอย่างปลอดภัย
ตอนนี้เพื่อทดสอบทฤษฎีนี้มีสองสิ่งที่คุณสามารถทำได้:
จัดสรรอาร์เรย์ matice2 อาร์เรย์ของคุณเช่น matice2 [razmor, 4096] และรันด้วย razmor = 1024, 1025 หรือขนาดใดก็ได้และคุณจะเห็นประสิทธิภาพที่แย่มากเมื่อเทียบกับที่คุณมีก่อนหน้านี้ เนื่องจากคุณจัดแนวคอลัมน์ทั้งหมดให้ขัดแย้งกัน
จากนั้นลอง matice2 [razmor, 4097] และเรียกใช้ด้วยขนาดใดก็ได้และคุณจะเห็นประสิทธิภาพที่ดีขึ้นมาก