c – std :: nth_element的SIMD实现

我有一个算法,运行在我的双核,3 GHz英特尔处理器平均250毫秒,我正在尝试优化它.目前,我有一个std :: nth_element调用,在150到300个元素的std :: vectors上调用大约6000次,平均需要50ms.我花了一些时间来优化我使用的比较器,它目前从矢量中查找两个双精度并且执行简单的<比较.比较器运行std :: nth_element的时间可以忽略不计.比较器的拷贝构造函数也很简单. 由于此调用目前占用了我的算法的20%的时间,并且由于时间大部分花费在我没有编写的nth_element的代码中(即不是比较器),我想知道是否有人知道一种方法使用SIMD或任何其他方法优化nth_element?我已经看到 some questions使用OpenCL和多个线程并行化std :: nth_element,但由于向量很短,我不确定从这种方法中可以获得多少好处,尽管我很乐意告诉我’我错了.

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

谢谢!

解决方法

两个想法:

>多线程可能不会加速任何单个矢量的处理,但随着矢量数量增加可能会对你有所帮助.>排序对于你的问题来说是一个太强大的工具:你正在计算向量的整个顺序,但你不关心除了前几个之外的任何东西.你知道每个向量有多少元素组成前5%,所以不是对整个事物进行排序,你应该通过数组一次并找到最大的k.你可以用额外的空间来做这个O(n)时间,所以它可能是一个整体的胜利.

相关文章

/** C+⬑ * 默认成员函数 原来C++类中,有6个默认成员函数: 构造函数 析构函数 拷贝...
#pragma once // 1. 设计一个不能被拷贝的类/* 解析:拷贝只会放生在两个场景中:拷贝构造函数以及赋值运...
C类型转换 C语言:显式和隐式类型转换 隐式类型转化:编译器在编译阶段自动进行,能转就转,不能转就编译...
//异常的概念/*抛出异常后必须要捕获,否则终止程序(到最外层后会交给main管理,main的行为就是终止) try...
#pragma once /*Smart pointer 智能指针;灵巧指针 智能指针三大件//1.RAII//2.像指针一样使用//3.拷贝问...
目录&lt;future&gt;future模板类成员函数:promise类promise的使用例程:packaged_task模板类例程...