Qt线程在内核上的共享似乎并不均等
Qt threading does not seem to share equally over cores
我有一个多线程应用程序。然而,我注意到,我正在使用OpenGL,如果没有信号量,这应该不会很好地工作。它确实做到了。我后来添加了信号量,因为它们应该被使用。
不太好的是,我现在有一个多线程应用程序,它似乎并没有真正利用cpu上的多线程或内核。
我的负载平衡似乎总是倾向于单核(4个),差异至少为40%。
我是否需要在Qt的项目文件中切换触发器,或者我是否忽略了其他内容?这种行为可能是意料之中的,但如果是这样的话,澄清一下就好了
我的平台是Ubuntu 11.10。
class DrawChunkThread : public QThread
{
public:
DrawChunkThread(World *world, int x, int z);
void run();
World *world;
int x;
int z;
static QSemaphore *sem;
private:
};
QSemaphore *DrawChunkThread::sem = new QSemaphore(1);
DrawChunkThread::DrawChunkThread(World *world, int x, int z) {
this->world = world;
this->x = x;
this->z = z;
}
void DrawChunkThread::run()
{
world->drawChunk(x, z);
if (world->isInside) {
world->drawInsideChunk(x, z);
}
}
如果您添加的信号量创建了一个太长或太争用(或两者都有)的关键部分,则会出现可伸缩性问题,因为并非所有线程都被允许同时执行代码,等待信号量会触发上下文切换,这会增加更多的开销。
通常,根据Amdahl定律,包含串行部分的并行应用程序的扩展不能超过并行部分除以内核数量。
如果没有任何具体的准则,我想不出任何其他建议可以给你。
相关文章:
- 在cuda线程之间共享大量常量数据
- 共享队列的线程安全
- 线程之间的实时数据共享
- 处理影响跨不同线程共享对象的定时回调的最佳方法是什么?
- 多线程减慢程序速度:无错误共享,无互斥锁,无缓存未命中,无小工作量
- 跨线程共享读取资源
- 简单使用 std::atomic 在两个线程之间共享数据
- 当 2 个线程共享同一物理内核时,具有错误共享的易失性增量在发布中的运行速度比在调试中慢
- 跨线程共享数据集与拆分每个线程的数据
- 在多线程函数中返回共享的常量指针会导致计时问题吗?
- 是否可以在并行区域中为共享 2D 数组创建选定元素的线程本地副本?(共享,私有,障碍:OPenMP)
- C++ 两个线程,共享几个整数变量
- OpenMP:当我按线程 ID 访问共享变量时,我是否需要一个关键部分
- 多个 OpenMP 线程读取(而不是写入)共享变量的性能成本?
- OpenMP:共享同一算法的单线程和多线程实现
- CUDA:来自不同翘曲但相同块的 2 个线程尝试写入相同的共享内存位置:危险?
- 多线程和共享资源:使用C++定期将数据从缓冲区(数据结构)复制到文件
- 通过为每个线程独占使用对象(不在线程之间共享)是保护该类的成员函数所必需的
- 在C 中共享线程之间的列表
- 多个动态链接库(DLL)是否可以从静态库(LIB)共享线程本地存储