何时施放到__M256而不是加载是正确的

When is it correct to cast to __m256 instead of loading?

本文关键字:加载 M256 何时施      更新时间:2023-10-16

我有一个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 ); 

我正在使用Intel的Embree Library,它们具有一个VFLOAT8类,该类将其内部存储为_M256和Float8的结合,因此根本没有铸造 - 但似乎也没有负载调用。如果我嵌入vfloat8类:

void GenerateRayDirections( &ray.x.v, &ray.y.v, &ray.z.v ); 

我正在寻找有关何时加载或铸造的指导?

在实践中,就生成的程序集而言,铸件或呼叫_mm256_load_ps的呼叫之间应没有区别。正如您指出的那样,您甚至可以通过工会获得理想的结果。

所有这些都将在引擎盖下生成负载和商店(vmov)指令。

为什么您希望手动致电_mm256_load_ps?因为它迫使您考虑何时将数据从内存转移到向量寄存器。使用铸造和工会的缺点是您可能不知道负载和商店。它们具有重大的延迟处罚,更糟糕的是,高级源代码可能指示的内容。

使用诸如_mm256_loadu_ps之类的内在系统的另一个好处是,您允许不规则的内存访问而无需恶性崩溃。