2017-02-25 72 views
1

我有8个矢量的32字节对齐的结构在它:什么时候将__m256转换为正确而不是加载?

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); 

我使用英特尔的恩布里库,他们有一个vfloat8类内部存储的表示形式_m256和是float8的工会,所以根本没有铸造 - 但似乎也没有负载电话。如果我改为嵌入vfloat8类:

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

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

+0

当你想让它们在一个向量中时加载到向量上,并在你想要投射概念时施放它们,你确定要加载吗?你的汇编代码证明了它吗? – Martin

回答

0

实际上,就生成的程序集而言,在演员或电话号码_mm256_load_ps之间应该没有区别。正如你指出的那样,你甚至可以通过联合来获得理想的结果。

但是,所有这些都会生成加载和存储指令(vmov)。

为什么您可能更喜欢手动拨打_mm256_load_ps?因为它迫使你考虑数据何时从内存移动到向量寄存器。使用铸造和工会的缺点是你可能不知道装载和存储。它们具有显着的延迟惩罚,更糟糕的是高级源代码可能指示什么。

使用像_mm256_loadu_ps这样的内在函数的另一个好处是您可以在没有恶意崩溃的情况下允许未对齐的内存访问。

相关问题