如何加速我的多线程程序?

时间:2016-08-10 13:49:43

标签: c++ multithreading pthreads

我有Pthread包装类:

class MyPthreadWrapper : public Thread{
public:
    MyPthreadWrapper(bool* basicSieve, bool* curSieve,     unsigned int startCell, unsigned int endCell, unsigned int rootFromMaxV);        

    ~MyPthreadWrapper();

    void run();

    long long runTime;
private:    
    bool* curSieve;   
    bool* basicSieve;
    unsigned int startCell,endCell,rootFromMaxV;        
};

这是实现run-method,它将在不同的线程中运行:

void MyPthreadWrapper::run(){
    if (startCell<=endCell){
        long long startTime=getCurrentTimeInMS();        
        for (int i=2; i<=rootFromMaxV; i++){
            if (basicSieve[i]==false){
                unsigned int j=i*i;
                if (j<=endCell){
                    unsigned int startJ2=((startCell+i-1)/i)*i;                                   
                    if (startJ2>j){
                        j=startJ2;
                    }                    
                    for (; j<=endCell; j+=i){
                        curSieve[j-startCell]=1;                        
                    }
                }
            }
        }        
        runTime=getCurrentTimeInMS()-startTime;
    }
}

BasicSieve数组适用于所有线程,其大小约为50MB。每个线程的CurSieve数组会有所不同,它的大小约为400MB。 BasicSieve数组包含范围[2..45000]中的素数(if(basicSieve [i] == false),然后我是素数)。内部循环适用于每个素数迭代器(endCell和startCell之间的差异为~400000000,因此对于i == 2内部循环将运行~200000000次迭代,依此类推。如果我在家用计算机上运行我的程序,运行时是单个主题 23.6s 四个主题 18.5s 19.2s 8 线程(处理器i7-4770,8GB RAM)。但如果我在服务器计算机(Xeon E5-2690,64GB RAM)上运行程序,它可以 40.4s 主题 12.7s 4 线程和 10.8s 8 线程。如何解释?我发现问题在于代码行

curSieve[j-startCell]=1; 

如果我们从这行删除访问数组curSieve,程序的加速将与线程数成正比。我如何解决它,加速出现在任何计算机上?

0 个答案:

没有答案