• 9892阅读
  • 12回复

qt  多线程速度问题 [复制链接]

上一主题 下一主题
离线leonardhead
 
只看楼主 倒序阅读 楼主  发表于: 2010-08-20
— 本帖被 XChinux 从 General Qt Programming 移动到本区(2011-01-02) —
我现在在做一个程序的并行化 
有三个算法做数据处理

1,占用空间220M 运行速度 11分钟

2 占用空间 450M 运行速度 11分钟

3 占用空间300M 运行速度 17分钟


一开始我使用的 顺序方法 一个一个运行 时间大概有40分钟 左右

我今天用的 QThread 来并行这三个算法  因为 这三个算法 本身不涉及任何 的 数据冲突 所以 我只是用了 最简单的方法。

class ThreadA:QThread
{}
class ThreadB:QThread
{}
class ThreadC:QThread
{}

main()
{
ThreadA a;
ThreadB b;
ThreadC c;

a.start();
b.start();
c.start();

a.wait();
b.wait();
c.wait();

}
 整个算法 大概就是这么个意思

但是 我运行的时候 却发现 运行时间居然要55分钟 比原来还要慢 

不知道是为什么, 我是第一次用到多线程  请教各位高手  如何能够解决问题 谢谢
离线xtfllbl

只看该作者 1楼 发表于: 2010-08-20
多核处理器吗?运算时是否占用了全部核心?牵涉到大容量数据读取吗(比如100G以上的数据读取)?
上海欢迎您
离线leonardhead
只看该作者 2楼 发表于: 2010-08-20
我用的是四核处理器运算时 cpu 显示 有三个 被利用 cpu 利用率 达到70% 但是 速度却比原来慢  没有那么多数据  最多不超过2G 而且都是 在内存里生成的
离线xtfllbl

只看该作者 3楼 发表于: 2010-08-20
引用第2楼leonardhead于2010-08-20 13:29发表的  :
我用的是四核处理器运算时 cpu 显示 有三个 被利用 cpu 利用率 达到70% 但是 速度却比原来慢  没有那么多数据  最多不超过2G 而且都是 在内存里生成的

三个线程分别读写数据么?原始做法是不是读写一次?这样就说的通了。
上海欢迎您
离线leonardhead
只看该作者 4楼 发表于: 2010-08-21
引用第3楼xtfllbl于2010-08-20 14:34发表的  :
三个线程分别读写数据么?原始做法是不是读写一次?这样就说的通了。



数据 都是初始的时候 读取的 然后就是分别做各自的操作, 简单的说 就是 一个很大的while loop 然后 loop 大概300万次  

三个算法 都差不多  都是相同的原理。


但是 三个函数都运行完毕后  要返回主线程  把它们的操作结果 返回给主线程

按道理说 如果都是独立的操作应该很快才对, 可是却非常的慢

请问 你在做多线程的时候 遇到几个互不相干的 算法 并行的时候 一般采取什么策略
离线dbzhang800

只看该作者 5楼 发表于: 2010-08-21
不妨先见简单一下你线程相关的这部分代码时怎么写的
离线leonardhead
只看该作者 6楼 发表于: 2010-08-27
引用第5楼dbzhang800于2010-08-21 07:29发表的  :
不妨先见简单一下你线程相关的这部分代码时怎么写的


#include <vector>
#include <map>
#include "Des.h"
#include "DesState.h"
#include "DesEvent.h"

#include <string>
#include <iostream>
#include <QMessageBox>
#include <sstream>
#include <set>
#include "ProductTransitionMap.h"
#include "TireStorage.h"
#include "PendingList.h"
#include <deque>
#include <qthread>

namespace DESpot
{

    class modifiedSyn: public QThread
{

public:
    public:
    typedef std::map<std::wstring,short> GlobalEventMap;
    typedef std::map<std::wstring,short>::iterator GlobalEventMapIt;
    typedef std::map<short,std::wstring> ConEventSet;
    typedef std::map<short,std::wstring>::iterator ConEventSetIt;
    typedef std::vector<const Des*> DesSet;
    typedef std::vector<const Des*> DesSetIt;

    typedef std::set<int> MarkedStateSet;
    typedef MarkedStateSet MarkedStateSetIt;


    typedef std::vector<short> SrcStateTuple;
    typedef std::deque<SrcStateTuple*> SourceStateList;
    typedef std::deque<int> NonblockCheckList;
    typedef std::set<int> BlockedStateList;

private:
    short supindex;
    DesSet &m_inDesSet;
    short DesNum;
    short EventNum;
    short StateMaxNum;
    short ***transitionMatrix;
private:
    SourceStateList m_pendingList;
    AlgoTrie *turpleStorage;
    ProductTransitionMap *tranMap;
    // new add
    NonblockCheckList m_nonblocklist;
    int nonblocknumber;
    PendingList *m_pending;


public:
    modifiedSyn(DesSet &in_DesSet):m_inDesSet(in_DesSet)
    {
        nonblocknumber=0;
   
    }
    ~modifiedSyn()
    {
        if(tranMap!=null)
        {
            delete tranMap;
            tranMap=null;
        }
        if(turpleStorage!=null)
        {
            delete turpleStorage;
            turpleStorage=null;
        }
        if(m_pending!=null)
        {
            delete m_pending;
            m_pending=null;
        }
    }


protected:

    void loadProductDes() //--1
    {
        //load ProductTransitionMap
        tranMap= new ProductTransitionMap (m_inDesSet);
        DesNum=tranMap->getDesNum();
        EventNum=tranMap->getEventNum();
        StateMaxNum=tranMap->getStateMaxNum();
        transitionMatrix=tranMap->getTransitionMatrix();

       //load turpleStorage
        turpleStorage=new AlgoTrie(m_inDesSet);

        m_pending=new PendingList(DesNum);
    }



    void createInitialStateTuple(short in_desNum) //--2
    {
        SrcStateTuple tuple(in_desNum);
        for(short i=0;i<in_desNum;i++)
        {
          
            const unsigned long long itmp=m_inDesSet->getInitialState().getId().id();
            unsigned long long tmp=itmp;
            tuple=(short)tmp;
        }


        turpleStorage->insert(&tuple);
        m_pending->PushPending(tuple);
       
    }


    void prerun()
    {
         loadProductDes();
         createInitialStateTuple(DesNum);
    }


public:
    void run()
    {

        prerun();
     //----------------------first phase, check and fill table---------------------------
     while(!m_pending->isEmpty())
     {
          SrcStateTuple crtSrcStateTuple(DesNum);
          m_pending->PopPending(crtSrcStateTuple);

        

          for(short i=1;i<EventNum;i++)
          {
              SrcStateTuple temptuple(DesNum);
              for(short j=0;j<DesNum;j++)
              {
                  short from_state=crtSrcStateTuple[j];
                  short to_state=transitionMatrix[j][from_state];
                  if(to_state!=-1)
                  {
                      temptuple[j]=to_state;
                  }
                  else
                  {
                      break;
                  }

                  if(j==DesNum-1)
                  {  // at end of the entry; the whole tuple is finished
                      if(turpleStorage->search(&temptuple)==false)
                      {
                          turpleStorage->insert(&temptuple);
                          m_pending->PushPending(temptuple);
                       }       
                  }

              }
          }

     }





    }




};

}


这个是 这个线程类的  代码    。  基本的思想就是一个

while() loop 然后做大概300万次的 计算  然后我再主程序中   这么调用的


    modifiedSyn *han1=new modifiedSyn(m_inDesSet);
    modifiedSyn *han2=new modifiedSyn(m_inDesSet);
    han1->start();
    han2->start();
    han1->wait();
    han2->wait();
    delete han1;
    delete han2;
    throw EX("DONE");


时间 和 顺序运行的一模一样  感觉上就是完全没有在并行,  我其实 就是吧原来的这个运算类 继承了  QTHREAD 然后吧 运行部分 写进了 run 函数里面 然后调运 start 还有 wait
离线leonardhead
只看该作者 7楼 发表于: 2010-08-27
引用第6楼leonardhead于2010-08-27 07:56发表的  :
#include <vector>
#include <map>
#include "Des.h"
.......




我问了我的几个同学 他们说 这个是属于 parallel task 的问题  不知道 qt 有没有相关的机制   各位前辈 有没有碰到过 相似的问题
我也觉得 我的方法 太简单了 但是 我在网上 找了好久 也没有找到什么相关的东西 
离线leonardhead
只看该作者 8楼 发表于: 2010-08-28
自己顶
离线kinzess

只看该作者 9楼 发表于: 2010-09-03
a.wait();
b.wait();
c.wait();

怀疑是这3个函数的影响....

离线jdwx

只看该作者 10楼 发表于: 2011-01-06
多线程不一定就快,主要看做什么,如果是整理磁盘碎片,几个线程也快不了,因为硬盘很慢
多线程能提高速度的程序,应该是任务对cpu来说利用率低的,又能同时运行,如下载。
如果cpu运行时到80-90了多线程就不能提高速度,反而因为切换线程浪费时间!
多线程主要能防止主界面假死。
发帖时要说明:操作系统、Qt版本、编译器,这样能更快的得到回复。
离线la_fisher

只看该作者 11楼 发表于: 2011-01-24
晕死,建议恶补线程知识。多线程绝对不会让你的程序速度变快的。除非你把几个线程安排在不同的CPU上。
离线voidbroken

只看该作者 12楼 发表于: 2011-03-30
引用第11楼la_fisher于2011-01-24 17:46发表的 :
晕死,建议恶补线程知识。多线程绝对不会让你的程序速度变快的。除非你把几个线程安排在不同的CPU上。



正解
快速回复
限100 字节
 
上一个 下一个