C++ 什么时候铸造到m256而不是装载是正确的?
我有一个32字节的对齐结构,其中有8个向量:C++ 什么时候铸造到m256而不是装载是正确的?,c++,casting,simd,avx2,C++,Casting,Simd,Avx2,我有一个32字节的对齐结构,其中有8个向量: struct ALIGN(32) Ray8 { float x[8]; float y[8]; float z[8]; }; 当使用AVX2时,我希望对这些成员进行一致操作。何时需要使用_mm256_load_ps()显式加载它们而不是强制转换它们?例如,使用以下签名: void GenerateRayDirections( __m256 * x, _m256 * y, _m256 * z ) { ... } 援引为 vo
struct ALIGN(32) Ray8
{
float x[8];
float y[8];
float z[8];
};
当使用AVX2时,我希望对这些成员进行一致操作。何时需要使用_mm256_load_ps()显式加载它们而不是强制转换它们?例如,使用以下签名:
void GenerateRayDirections( __m256 * x, _m256 * y, _m256 * z ) { ... }
援引为
void GenerateRayDirections( (__m256*)ray.x, (__m256*)ray.y, (__m256*)ray.z );
我使用的是Intel的embree库,他们有一个vfloat8类,在内部将表示存储为_m256和float8的联合,因此根本没有强制转换,但似乎也没有加载调用。如果改为嵌入vfloat8类:
void GenerateRayDirections( &ray.x.v, &ray.y.v, &ray.z.v );
我正在寻找一些关于何时加载或强制转换的指导?实际上,就生成的程序集而言,强制转换或调用
\u mm256\u load\u ps
之间应该没有区别。正如你所指出的,你甚至可以通过一个联合体得到想要的结果
然而,它们都会在引擎盖下生成加载和存储(vmov
)指令
为什么您希望手动调用\u mm256\u load\u ps
?因为它迫使您考虑数据何时从内存移动到向量寄存器。使用铸造和活接头的缺点是,您可能不知道加载和存储。它们带来了显著的延迟惩罚,比高级源代码可能表明的要糟糕得多
使用诸如
\u mm256\u loadu\u ps
之类的内部函数的另一个好处是,您允许未对齐的内存访问,而不会发生恶性崩溃。当您希望在向量中加载向量时,将其加载到向量,当您想要强制转换概念时,将其强制转换,您确定要加载吗?你的汇编代码能证明这一点吗?