【问题标题】:Using a Struct with SIMD Intrinsics使用带有 SIMD 内部函数的结构
【发布时间】:2021-12-09 20:14:54
【问题描述】:

假设我有一个结构

typdef struct point{
 
  float x;
  float y;
  float z;

} point; 

我有一个由这些结构组成的数组,我想执行以下操作 -

std::vector<point> copyArray;

for(auto p : array_of_points){
   
    point newPoint;

    newPoint.x = p.x;
    newPoint.y = p.y;
    newPoint.z = p.z;

    copyArray.push_back(newPoint);
}

现在,如果我可以同时对多个结构进行操作,我的代码中的这个特定部分可以使用向量操作来加速。

我有一个两部分的问题

  • 如何使用 SIMD 内在函数做到这一点。我不确定如何加载结构。
  • OpenMP 能否实现所需的矢量化。我对组装不太满意,无法弄清楚它是否确实被有效地矢量化了。

【问题讨论】:

标签: c++ openmp vectorization simd


【解决方案1】:

我希望循环无法矢量化,因为copyArray.push_back(newPoint); 正在访问共享资源。

如果您想加快速度,您可能想研究如何快速将数组转换为向量。您可以开始搜索here

【讨论】:

  • std::vector 不是线程安全的,因此任何访问它的线程都会假定它是唯一的线程。 (在 C++ 中,让多个线程同时在同一个 std::vector 上执行 .push_back() 将是数据争用未定义行为,因此编译器可以并且确实假设这不会发生。这就是编译器能够优化正常代码。)
  • 所以 TL:DR,即使 std::vector&lt;point&gt; copyArray; 是全局的,而不是同一函数中的局部变量,也不会停止自动矢量化。如果编译器设法将 3x4 = 12 字节块中的副本解开成一个简单的 memcpy,它应该矢量化或将其识别为 memset。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-11-05
  • 1970-01-01
  • 2013-07-27
  • 1970-01-01
  • 2012-06-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多