ฉันกำลังดูแอสเซมบลีที่สร้างขึ้นสำหรับโค้ดของฉัน (โดยใช้ Visual Studio 2017) และสังเกตเห็นว่า _mm_load_ps มักจะ (เสมอ?) คอมไพล์เป็น movups
ข้อมูลที่ฉันใช้ _mm_load_ps มีการกำหนดดังนี้:
struct alignas(16) Vector {
float v[4];
}
// often embedded in other structs like this
struct AABB {
Vector min;
Vector max;
bool intersection(/* parameters */) const;
}
ตอนนี้เมื่อฉันใช้โครงสร้างนี้ สิ่งต่อไปนี้จะเกิดขึ้น:
// this code
__mm128 bb_min = _mm_load_ps(min.v);
// generates this
movups xmm4, XMMWORD PTR [r8]
ฉันคาดหวังว่าจะมีการเคลื่อนย้ายเนื่องจาก alignas(16) ฉันจำเป็นต้องมีอย่างอื่นอีกหรือไม่เพื่อโน้มน้าวให้คอมไพเลอร์ใช้ momaps ในกรณีนี้?
แก้ไข: คำถามของฉันแตกต่างจากคำถามนี้ เพราะฉันไม่ได้รับข้อขัดข้องใด ๆ โครงสร้างมีการจัดตำแหน่งโดยเฉพาะและฉันก็ใช้การจัดสรรแบบจัดตำแหน่งด้วย แต่ฉันสงสัยว่าเหตุใดคอมไพเลอร์จึงเปลี่ยน _mm_load_ps (ที่แท้จริงสำหรับหน่วยความจำที่จัดตำแหน่ง) เป็น movups ถ้าฉันรู้ว่าโครงสร้างได้รับการจัดสรรตามที่อยู่ที่สอดคล้องกันและฉันกำลังเรียกมันผ่านทาง this* มันจะปลอดภัยที่จะใช้ momaps ใช่ไหม?
movaps
โดยเฉพาะเพื่อจุดประสงค์ใด - person harold   schedule 09.03.2017alignas
ไม่สมบูรณ์แบบหรือเป็นการรับประกันmemcpy
สามารถวางโครงสร้างเหล่านี้ไว้ที่ใดก็ได้ (รวมถึงตำแหน่งที่ไม่สอดคล้องกัน)malloc
จะไม่ให้หน่วยความจำที่สอดคล้องกันเสมอไป ฯลฯ ดูการหลอกลวง - โดยทั่วไปคุณจะต้องเขียนตัวจัดสรรของคุณเองโดยใช้_aligned_malloc
- person J...   schedule 09.03.2017__declspec(align(#))
แต่เนื่องจาก VS2015alignas
มีการใช้การสนับสนุนเป็นแผ่นไม้อัดเหมือนกัน) - person J...   schedule 09.03.2017movaps
เพื่อนำไปใช้_mm_load_ps
(โดยไม่คำนึงถึงการจัดตำแหน่งจริง) แต่เห็นได้ชัดว่าไม่ได้เกิดขึ้น - person harold   schedule 09.03.2017movaps
จะทำให้เกิดข้อยกเว้นกับที่อยู่ที่ไม่สอดคล้องกันอย่างแน่นอน - person J...   schedule 09.03.2017_mm_load_ps
ก็ได้รับอนุญาตให้ทำเช่นนั้นได้เช่นกัน แม้ว่าจะไม่จำเป็นต้องทำก็ตาม - person harold   schedule 09.03.2017