相关疑难解决方法(0)

C++ 11:std :: thread汇集了吗?

在C++ 03中,我使用pthread和自建的线程池,它总是保持几个线程运行(因为pthread_create速度很慢),这样我就可以在不考虑性能问题的情况下为小任务启动线程.

现在,在C++ 11中我们有std::thread.我想标准没有说明具体的实现,所以我的问题是标准的库实现.他们是否通常选择合并方法来构造std::threads是便宜的(例如不调用pthread_createposix),或者std::thread只是一个包装器?

换句话说,是否仍然在C++ 11中推荐一个线程池,或者我应该只std::thread在需要时创建一个并将性能提升到标准库?

c++ multithreading c++11 stdthread

39
推荐指数
3
解决办法
3万
查看次数

使用OpenMP块来破坏缓存

我一直在努力提高我的OpenMP解决方案的性能,这通常需要处理数组上的嵌套循环.虽然我已经设法从串行实现的59秒(在老化的双核Intel T6600上)将其降低到37,但我担心缓存同步会引起很多CPU注意(当CPU应该解决我的问题时! ).我一直在努力设置探查器,所以我没有证实这个说法,但我的问题无论如何.根据这个关于负载均衡的讲座:

CPU没有做好工作,而是忙着争夺程序中唯一使用过的缓存行.您可以使用一种非常奇怪的技术来解决这个问题:将CPU数据在内存中移动远远超过一个缓存行.例如,这里我们将每个线程访问的整数移动20个单位.

然后继续提供相关的源代码(因此应该在四核上运行%4)

#pragma omp parallel for schedule(static,1)
    for (unsigned int i=0;i<n;i++) {
    arr[(i%4)*20]++;
}
Run Code Online (Sandbox Code Playgroud)

也就是说,我对"大块"有什么直觉,但上面的实现似乎完全忽略了它,让我相信我的直觉是错误的.

我的问题是: 设置一个相当大的块值是否会将数据向下移动到缓存行?IE浏览器.上面的代码不会等同于

#pragma omp parallel for schedule(static, 20)
    for (unsigned int i=0;i<n;i++) {
    arr[i]++;
}
Run Code Online (Sandbox Code Playgroud)

c parallel-processing load load-balancing openmp

2
推荐指数
1
解决办法
1482
查看次数