【问题标题】:When is it correct to cast to __m256 instead of loading?什么时候转换为 __m256 而不是加载是正确的?
【发布时间】:2017-02-25 16:54:19
【问题描述】:

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

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

【问题讨论】:

  • 当你想要向量时加载到向量,当你想要转换概念时将它们转换,你确定要加载吗?你的汇编代码能证明吗?

标签: c++ casting simd avx2


【解决方案1】:

实际上,就生成的程序集而言,强制转换或调用_mm256_load_ps 应该没有区别。正如您所指出的,您甚至可以通过联合获得所需的结果。

不过,它们都会在后台生成加载和存储 (vmov) 指令。

为什么您更愿意手动拨打_mm256_load_ps?因为它迫使您考虑数据何时从内存移动到向量寄存器。使用强制转换和联合的缺点是您可能不知道加载和存储。它们会带来显着的延迟损失,比高级源代码可能表明的要糟糕得多。

使用像 _mm256_loadu_ps 这样的内部函数的另一个好处是,您可以在不发生恶性崩溃的情况下进行未对齐的内存访问。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-06-21
    • 2010-09-23
    • 2019-01-17
    • 1970-01-01
    • 1970-01-01
    • 2012-09-22
    • 2012-12-16
    • 1970-01-01
    相关资源
    最近更新 更多