【发布时间】: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 能否实现所需的矢量化。我对组装不太满意,无法弄清楚它是否确实被有效地矢量化了。
【问题讨论】:
-
如果您只想复制向量,那么只需执行
std::vector<point> copyArray(array_of_points.begin(), array_of_points.end()),编译器可能会将其优化为 SIMD 内在函数 -
SIMD 通常在您有 3 个单独的数组(x、y 和 z 各一个)时效果更好。您可以在单个 SIMD 向量中处理几何向量,但与一次处理 4 个 xyz 几何向量相比,它笨重且速度较慢(对于复制以外的其他内容),即使您填充 SIMD 向量也是如此xyzw 和未使用的 w。请参阅 stackoverflow.com/tags/sse/info,尤其是 Slides + text: SIMD at Insomniac Games (GDC 2015),它专门涵盖了这种 SIMD 反模式。
-
例如this code optimises 到
memcpy将在内部使用内部函数 -
什么是
array_of_points?如果它也是一个std::vector<point>,只需从中复制构造copyArray。如果它是不同结构的向量(不同类型的x,y,z,或其他成员变量),问题会有所不同。您应该始终提供 minimal reproducible example!
标签: c++ openmp vectorization simd