Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/142.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何在C++;_C++_Multithreading - Fatal编程技术网

C++ 如何在C++;

C++ 如何在C++;,c++,multithreading,C++,Multithreading,我已经使用std::sort编写了以下用于多线程排序的多线程程序。在我的程序中,grainSize是一个参数。因为grainSize或可以生成的线程数是一个系统相关的特性。因此,我没有得到应该设置grainSize的最佳值是什么?我在Linux上工作 int compare(const char*,const char*) { //some complex user defined logic } void multThreadedSort(vector<unsigned&

我已经使用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;
}
int比较(常量字符*,常量字符*)
{
//一些复杂的用户定义逻辑
}
void multThreadedSort(向量::迭代器数据,int len,int grainsize)
{
if(len
我需要执行多线程排序。因此,为了对大向量进行排序,我可以利用当今处理器中存在的多个核。如果有人知道一个有效的算法,那么请分享


我不知道为什么multiThreadedSort()返回的值没有排序,您是否看到其中存在一些逻辑错误,然后请告诉我相同的情况,理想情况下,系统中运行的线程不能超过n*2个。n是CPU核心数

现代操作系统使用的概念是。因此,现在一次在一个CPU上可以运行两个线程


正如在另一个答案中提到的,在C++11中,可以使用
std::thread::hardware_concurrency()获得最佳线程数

这为您提供了最佳的线程数(如内核数):

正如您编写的,您的有效线程数不等于
grainSize
:它将取决于列表大小,并且可能比grainSize多得多

只需将grainSize替换为:

unsigned int grainSize= std::max(items.size()/nThreads, 40);
40是任意的,但它是为了避免启动线程对少数项目进行排序,这将是次优的(启动线程的时间将大于对少数项目进行排序)。它可以通过反复试验进行优化,并且可能大于40

您至少有一个bug:

multThreadedSort(data + len/2, len/2, grainsize);
如果len是奇数(例如9),则不包括排序中的最后一项。替换为:

multThreadedSort(data + len/2, len-(len/2), grainsize);

除非您使用的编译器实现完全不完整(不正确的单词是break,更好的匹配应该是…shitty),否则几次调用
std::future
应该已经为您完成了这项工作,而不必担心

请注意,
std::future
在概念上是异步运行的,也就是说,它可能会产生另一个线程来并发执行。可以,而不是必须,提醒你。
这意味着,对于一个实现来说,在每个将来只生成一个线程是完全“合法的”,而且完全不生成任何线程,只在
wait()中执行任务也是合法的
在实践中,sane实现避免按需生成线程,而是使用一个线程池,其中工作线程的数量根据代码运行的系统设置为合理的数量

请注意,尝试使用
std::thread::hardware\u concurrency()
优化线程并不能真正帮助您,因为该函数的措辞过于松散,没有用处。完全允许实现返回零,或或多或少任意的“最佳猜测”,并且没有机制让您检测返回值是真实值还是胡说八道值。
也没有办法区分超读内核,或者任何类似NUMA感知之类的东西。因此,即使你假设这个数字是正确的,它仍然没有什么意义

更一般地说 如果有一个很好的通用答案,“正确的线程数是多少”这个问题很难解决(我相信没有)。需要考虑以下几点:

  • 10人的工作组肯定太小了。产生一个线程是一件非常昂贵的事情(是的,这与流行的观点相反,Linux也是如此),切换或同步线程也非常昂贵。试试“一万”,而不是“十”
  • 超线程内核仅在同一组中的另一个内核暂停时执行,最常见的是在内存I/O上(或者,在旋转时,通过显式执行指令,例如Intel上的REP-NOP)。如果没有大量内存暂停,那么在超线程内核上运行的额外线程只会添加上下文切换,但不会运行得更快。对于排序(这都是关于访问内存的!)之类的事情,您可能最好尽可能地去做
  • 内存带宽通常被一个(有时是两个)内核饱和,很少超过一个(取决于实际硬件)。在这个问题上抛出8或12个线程通常不会增加内存带宽,但会增加共享缓存级别(如存在三级缓存,通常还有二级缓存)和系统页面管理器的压力。对于排序的特殊情况(非常不连贯的访问,大量的暂停),情况可能正好相反。可以,但不必
  • 由于上述原因,对于一般情况,“实核数”或“实核数+1”通常是更好的建议
  • 使用您的方法访问大量局部性差的数据(单线程或多线程)将导致大量缓存/TLB未命中,甚至可能导致页面错误。这可能不仅会抵消线程并行性带来的任何好处,而且执行速度可能会慢4-5个数量级。想想页面错误会让你付出多大代价。D
    multThreadedSort(data + len/2, len-(len/2), grainsize);