SIMD Implementation of std::nth_element

SIMD Implementation of std::nth_element

本文关键字:nth element std Implementation of SIMD      更新时间:2023-10-16

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

由于这个调用目前占用了我算法20%的时间,而且大部分时间都花在了我没有写的nth_element的代码中(即不是比较器),我想知道是否有人知道使用SIMD或任何其他方法优化nth_element的方法?我看到了一些关于使用OpenCL和多线程并行化std::nth_element的问题,但由于向量很短,我不确定这种方法会给我带来多大好处,尽管我很乐意被告知我错了。

如果有SSE方法,我可以使用SSE4.2之前的任何SSE指令。

谢谢!

两个想法:

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

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