Saya melihat rakitan yang dihasilkan untuk kode saya (menggunakan Visual Studio 2017) dan memperhatikan bahwa _mm_load_ps sering (selalu?) dikompilasi ke movup.
Data yang saya gunakan _mm_load_ps didefinisikan seperti ini:
struct alignas(16) Vector {
float v[4];
}
// often embedded in other structs like this
struct AABB {
Vector min;
Vector max;
bool intersection(/* parameters */) const;
}
Sekarang ketika saya menggunakan konstruksi ini, hal berikut akan terjadi:
// this code
__mm128 bb_min = _mm_load_ps(min.v);
// generates this
movups xmm4, XMMWORD PTR [r8]
Saya mengharapkan movaps karena alignas(16). Apakah saya memerlukan sesuatu yang lain untuk meyakinkan kompiler agar menggunakan movaps dalam kasus ini?
EDIT: Pertanyaan saya berbeda dari pertanyaan ini karena saya tidak mengalami error apa pun. Strukturnya diselaraskan secara khusus dan saya juga menggunakan alokasi yang selaras. Sebaliknya, saya ingin tahu mengapa kompiler mengalihkan _mm_load_ps (intrinsik untuk memori yang selaras) ke movup. Jika saya tahu struct dialokasikan pada alamat yang selaras dan saya memanggilnya melalui ini* akan aman menggunakan movaps, bukan?
movaps
? - person harold   schedule 09.03.2017alignas
tidak sempurna atau jaminan,memcpy
dapat meletakkan struct ini di mana saja (termasuk lokasi yang tidak selaras),malloc
tidak akan selalu memberi Anda memori yang selaras, dll. Lihat penipuannya - biasanya Anda perlu menulis pengalokasi Anda sendiri menggunakan_aligned_malloc
. - person J...   schedule 09.03.2017__declspec(align(#))
, tetapi sejak dukungan VS2015alignas
diimplementasikan sebagai veneer untuk hal yang sama). - person J...   schedule 09.03.2017movaps
untuk mengimplementasikan_mm_load_ps
(terlepas dari penyelarasan sebenarnya), hal itu tampaknya tidak terjadi - person harold   schedule 09.03.2017movaps
pasti akan menimbulkan pengecualian dengan alamat yang tidak selaras. - person J...   schedule 09.03.2017_mm_load_ps
diperbolehkan melakukan itu juga, meskipun tidak harus - person harold   schedule 09.03.2017