gpt4 book ai didi

c++ - 按列主要顺序重新排序 3D vector 三元组很慢

转载 作者:可可西里 更新时间:2023-11-01 18:39:46 28 4
gpt4 key购买 nike

我有很多 (x1,y1,z1),(x2,y2,z2),(x3,y3,z3) 单精度 vector 三元组,我想对它们重新排序,所以(x1,y1,z1),(x2,y2,z2),(x3,y3,z3)成为(x1,x2,x3,0,y1,y2,y3,0,z1,z2,z3,0)

目标是为基于 SSE 的计算准备数据集。我有以下代码来执行此操作:

for (int i=0;i<count;i++)
{
Vect3F p0 = get_first_point(i);
Vect3F p1 = get_second_point(i);
Vect3F p2 = get_third_point(i);
int idx = i*3;
scratch[idx] = Vec4F(p0.x, p1.x, p2.x, 0); // These 3 rows are the slowest
scratch[idx+1] = Vec4F(p0.y, p1.y, p2.y, 0);
scratch[idx+2] = Vec4F(p0.z, p1.z, p2.z, 0);
}

循环的最后 3 行非常慢,它们占用了我整个算法时间的 90%!

这正常吗?我可以让这样的洗牌更快吗?(scratch 是一个静态变量,并且是 16 对齐的。该函数被频繁调用,所以我认为 scratch 的 block 不应该从缓存中消失。)

最佳答案

首先,您不应该创建 3 个临时 vector 对象。而不是:

tri = triangles[i];
Vect3F p0 = points[indices[tri]];
Vect3F p1 = points[indices[tri+1]];
Vect3F p2 = points[indices[tri+2]];

您应该只使用 memcpy() 复制数据;为您的整个集合制作一个循环并复制原始数据。这是我能想到的最快的方法。

使用 3 个变量运行许多构造函数,速度非常慢。出于同样的原因,第二种方式(来自评论)也好不到哪儿去。

关于c++ - 按列主要顺序重新排序 3D vector 三元组很慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7936315/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com