Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/134.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 什么时候铸造到m256而不是装载是正确的?_C++_Casting_Simd_Avx2 - Fatal编程技术网

C++ 什么时候铸造到m256而不是装载是正确的?

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

我有一个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库,他们有一个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
之类的内部函数的另一个好处是,您允许未对齐的内存访问,而不会发生恶性崩溃。

当您希望在向量中加载向量时,将其加载到向量,当您想要强制转换概念时,将其强制转换,您确定要加载吗?你的汇编代码能证明这一点吗?