Ste*_*ner 5 c++ multithreading
我已经编写了以下多线程程序,用于使用std :: sort进行多线程排序.在我的程序中,grainSize是一个参数.由于grainSize或可以生成的线程数是系统相关的功能.因此,我没有得到应该将grainSize设置为的最佳值?我在Linux上工作?
int compare(const char*,const char*)
{
//some complex user defined logic
}
void multThreadedSort(vector<unsigned>::iterator data, int len, int grainsize)
{
if(len < grainsize)
{
std::sort(data, data + len, compare);
}
else
{
auto future = std::async(multThreadedSort, data, len/2, grainsize);
multThreadedSort(data + len/2, len/2, grainsize); // No need to spawn another thread just to block the calling thread which would do nothing.
future.wait();
std::inplace_merge(data, data + len/2, data + len, compare);
}
}
int main(int argc, char** argv) {
vector<unsigned> items;
int grainSize=10;
multThreadedSort(items.begin(),items.size(),grainSize);
std::sort(items.begin(),items.end(),CompareSorter(compare));
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我需要执行多线程排序.因此,对于排序大型矢量,我可以利用当今处理器中存在的多个核心.如果有人知道一个有效的算法,那么请分享.
我不知道为什么multiThreadedSort()返回的值没有排序,你看到它有一些逻辑错误,那么请让我知道相同的
这为您提供了最佳线程数(例如核心数):
unsigned int nThreads = std::thread::hardware_concurrency();
Run Code Online (Sandbox Code Playgroud)
在您编写它时,您的有效线程数不等于grainSize
:它将取决于列表大小,并且可能远远超过grainSize.
只需将grainSize替换为:
unsigned int grainSize= std::max(items.size()/nThreads, 40);
Run Code Online (Sandbox Code Playgroud)
40是任意的但是要避免启动线程以便排序到少数项目,这将是次优的(开始线程的时间将大于排序少数项目).它可以通过反复试验进行优化,并且可能大于40.
你至少有一个错误:
multThreadedSort(data + len/2, len/2, grainsize);
Run Code Online (Sandbox Code Playgroud)
如果len是奇数(例如9),则不包括排序中的最后一项.替换为:
multThreadedSort(data + len/2, len-(len/2), grainsize);
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
2197 次 |
最近记录: |