【问题标题】:Is there any speedup available on this code?此代码是否有任何加速?
【发布时间】:2016-09-29 10:51:23
【问题描述】:

我只是猜测这段代码是否还有提升性能的空间:

std::vector<int>actualUvIndex(polyCount * 3, 0);
for (int i = 0; i < actualUvIndex.size(); i++)
{
    actualUvIndex[i] = i;
}

#pragma omp parallel for schedule(dynamic)
for (int group = 0; group < groupList.size(); group++)
{
    //take care per group only
    for (int si = 0; si < groupList[group].size(); si++)
    {
        //take care per vertex
        for (int v = 0; v < 3; v++)
        {
            int externalindex = groupList[group][si]->uvindex[v];

            //if it has been changed forget about it
            if (actualUvIndex[externalindex] == externalindex)
            {
                //compare with the rest of faces inside the group
                for (int sib = si + 1; sib < groupList[group].size(); sib++)
                {
                    for (int vb = 0; vb < 3; vb++)
                    {
                        int internalindex = groupList[group][sib]->uvindex[vb];
                        //if it has been changed forget about it
                        if (actualUvIndex[internalindex] == internalindex)
                        {
                            //if both uv vertex are equal just assign the same vertex index
                            if (groupList[group][sib]->uvs[vb][0] == groupList[group][si]->uvs[v][0] && groupList[group][sib]->uvs[vb][1] == groupList[group][si]->uvs[v][1])
                                actualUvIndex[internalindex] = externalindex;
                        }

                    }
                }
            }
        }
    }
}

让我稍微解释一下: 我将我的几何体(是的,它大约是 3d 网格)分成了几组,因此将每个几何体分开是有意义的。

每个组包含面,每个面3个顶点我可以得到访问组的每个顶点的索引->面->uvindex。

actualUvIndex 是一个向量,用于管理每个顶点的索引。

显然我的意图是简化并将找到的第一个索引分配给冗余顶点,这意味着冗余的顶点共享存储在 uvs[][0] 和 uvs[][1] 中的位置,请注意,因为那是 uvs它们只有两个轴。

问候并感谢您提前提供任何提示。

【问题讨论】:

  • 您应该前往 codereview stackexchange。这个问题更适合那里
  • 您在哪个平台上运行?您使用的是什么编译器和编译器选项?
  • 马上开始...for (int i = 0; i &lt; actualUvIndex.size(); i++) { actualUvIndex[i] = i; } 这整个事情可以用std::iota 替换,编译器可能会更优化。顺便说一句,不要使用int 来索引数组。
  • @Hayt 从未听说过,谢谢! AndrewHenle Win64 VisualStudio 2016 默认选项,但支持 OpenMP。 erip 谢谢你的提示!无论如何我认为这应该不是一个大问题,但瓶颈在于嵌套的fors。

标签: c++ simplify


【解决方案1】:

您可以通过使用索引来搜索重复的顶点来加速您的代码。为您的顶点定义一个 has 函数,然后迭代顶点并将它们放入 std::unordered 映射中,使用顶点作为键和索引作为值。放置时,检查该键是否已经有值:如果有,请使用地图中的索引。这样复杂度将是 o(顶点数)。

【讨论】:

  • 不幸的是,这个值是两个浮点数,所以我不能将它指定为键。
  • 您可以使用 float 作为键。这不是被禁止的,只是将浮点数比较是否相等被认为是一种不好的做法。但是在您的代码中,您已经这样做了:groupList[group][sib]-&gt;uvs[vb][0] == groupList[group][si]-&gt;uvs[v][0]。所以 std::unordered_set 将等同于您的代码。但是如果相等比较不合适,那么加速的想法仍然是一样的,但是你需要另一种类型的索引。例如像 k-d 树这样的东西。
猜你喜欢
  • 2020-02-25
  • 2017-08-09
  • 2013-07-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-06
相关资源
最近更新 更多