我有一个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 ) { ... }
调用
void GenerateRayDirections( (__m256*)ray.x, (__m256*)ray.y, (__m256*)ray.z );
我正在使用英特尔的embree库,他们有一个vfloat8类,它在内部将表示存储为_m256和float8的联合,所以根本没有投射 - 但似乎也没有加载电话。如果我改为嵌入vfloat8类:
void GenerateRayDirections( &ray.x.v, &ray.y.v, &ray.z.v );
我正在寻找关于何时加载或投射的一些指导?
答案 0 :(得分:2)
实际上,就生成的程序集而言,对_mm256_load_ps
的强制转换或调用之间应该没有区别。正如您所指出的,您甚至可以通过工会获得所需的结果。
然而,所有这些都会产生负载并存储(vmov
)指令。
为什么您更愿意手动拨打_mm256_load_ps
?因为它迫使您考虑数据何时从内存移动到向量寄存器。使用铸造和工会的缺点是你可能不知道装载和存储。它们具有显着的延迟惩罚,比高级源代码可能指示的更糟糕。
使用像_mm256_loadu_ps
这样的内在函数的另一个好处是允许在没有恶意崩溃的情况下进行未对齐的内存访问。