SIMD实现std :: nth_element

时间:2013-11-22 14:47:48

标签: c++ performance sse simd stl-algorithm

我的算法在我的双核3 GHz Intel处理器上平均运行250毫秒,我正在尝试对其进行优化。目前,我有一个std::nth_element调用,在std::vector的150到300个元素之间调用大约6000次,平均需要50ms。我花了一些时间来优化我使用的比较器,它目前从向量中查找两个double并执行简单的<比较。比较器运行std::nth_element的时间可以忽略不计。比较器的拷贝构造函数也很简单。

由于此调用当前占用了我的算法的20%的时间,并且由于时间大部分花费在nth_element的代码中,而我没有写(即不是比较器),我想知道如果有人知道使用SIMD或任何其他方法优化nth_element的方法?我已经看到some questions使用OpenCL和多个线程并行std::nth_element,但由于向量很短,我不确定从这种方法中获得多少好处,尽管我是开放的被告知我错了。

如果有SSE方法,我可以使用任何SSE指令(当前,我认为)SSE4.2。

谢谢!

1 个答案:

答案 0 :(得分:3)

两个想法:

  1. 多线程可能不会加快任何单个矢量的处理速度,但随着矢量数量的增加,它可能对您有所帮助。

  2. 排序对于你的问题来说是一个太强大的工具:你正在计算向量的整个顺序,但你不关心除了前几个之外的任何东西。你知道每个向量有多少元素构成前5%,所以不应该对整个事物进行排序,而应该让一个通过数组并找到k最大的元素。你可以O(n)时间k额外的空间,所以这可能是一个整体胜利。