我有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,程序的加速将与线程数成正比。我如何解决它,加速出现在任何计算机上?