何时施放到__M256而不是加载是正确的
When is it correct to cast to __m256 instead of loading?
我有一个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
之类的内在系统的另一个好处是,您允许不规则的内存访问而无需恶性崩溃。
相关文章:
- std::原子加载和存储都需要吗
- 如何加载(或映射)文件部分的最大大小,但适合在Windows上的RAM
- C++ 雷神库 - 使用资源加载器类时出现问题(不命名类型)
- 为什么加载SDF会导致Mobilizer创建闭环错误
- C++atioglxx.pdb未加载错误glBufferData OpenGL
- 如何使用tinyxml2从XML加载父实体和子实体
- 如何在C++中使用pybind11加载一个pickle python列表
- 系统.将数组移交给c#中动态加载的c++DLL时发生AccessViolationException
- 当我尝试加载内核模块时,如何修复C++中的这个 malloc() 错误?
- 树莓上的 Libtorch 无法加载 pt 文件,但在 ubuntu 上工作
- Python ctypes:不会按预期加载 dll
- 为什么会出现 gettnig 运行时错误:加载类型为"_Bit_type"(stl_bvector.h) 的空指针?
- 我的程序有一个保存配置文件的GUI,如何双击此配置文件以直接加载带有配置数据的GUI?
- 保存/加载大量短数组到二进制文件
- 使用 SDL2 和SDL_image C++加载图像
- 无法使用加载库卸载注入的 dll (C++)
- 是否有原子加载非原子值的函数?
- 将 bmp 文件加载到 TSpeedButton 中
- 如何使用Qt 3D库加载和显示搅拌机.obj源文件场景
- 加载与引用 .NET DLL 位于同一文件夹中的引用的 .NET DLL 时"Not found"异常