SIMD Implementation of std::nth_element
SIMD Implementation of std::nth_element
我有一个算法,它在我的双核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指令。
谢谢!
两个想法:
-
多线程可能不会加快任何单个向量的处理速度,但随着向量数量的增加,可能会对您有所帮助。
-
排序对于你的问题来说是一个太强大的工具:你在计算向量的整个顺序,但除了前几个,你什么都不在乎。你知道每个向量有多少元素构成了前5%,所以你不应该对整个东西进行排序,而应该让一个通过数组,找到最大的
k
。你可以在O(n)
的时间里用k
的额外空间来完成这项任务,所以这可能是一场胜利。
相关文章:
- 如何将 bsoncxx::d ocument::element 写入控制台
- [bsoncxx ]如何附加一个bsoncxx::d ocument::element TO bsoncxx::buil
- 错误 C2864:'element::next':只能在类 (STRUCT) 中初始化静态常量整数数据成员
- 在面包车文件中从MTH染色体中读取nth
- QXmlStreamReader 阅读<element><value/></element>
- Met c++ 代码" #define ELEMENT(TYPE, FIELD)"
- 如何更改C 中的nth模板参数
- gcc 未给出的 Clang 错误"attempted to construct a reference element in a tuple with an rvalue"
- 迭代器在std::unordered_map<int,std::vector<Element>>
- 'class Poco::XML::Element'没有名为'getNodeByPath'的成员
- 矢量中没有find(element)方法
- 是否可以在C++中使用命名变量(例如,键和值)而不是 .first 和 .second 进行 std::map<> "for element : container" 迭代?
- 在给定的 c++ 代码中"delete [] element"以实现一维数组的目的是什么?
- C++:如何生成帕斯卡三角形的'nth'线?
- 在 gcc 中使用 erase(begin()) 从unordered_set "remove one element"很慢
- 如何从 gdcm::Tag 访问"group, element"字符串
- GStreatermm:通过从Gst::element派生创建一个新的元素类型(在插件中)
- 缓冲区和变量Element未声明(首次在函数中使用)
- 有一个指向std::vector-element的指针,该指针目前还不存在,但稍后将被构造,这是个好主意吗?
- 查找给定的日期,即月份和月份 C/C++ 内"nth"出现的一天