2015-02-09 106 views
0

我是C++线程的新手,但我已经做了足够的阅读,至少可以获得我正在编译的内容。到目前为止,它还没有改善性能。现在我只是让它创建线程的数量,因为有循环,但我可以想象,这可能会很快导致系统颠簸。有更好的选择来控制线程数量吗?我也打算在WestGrid计算系统上运行这个系统,我可以指定要使用的处理器数量。设置线程数量以优化处理器数量的最佳方法是什么?C++多线程优化

void ExecuteCRTProcess(const long &numberOfRows, ZZ* rij, const ZZ &powRoh, const int &rowLength, long* PublicKey, ZZ* rQ0, const ZZ &Q0, ZZ* primes, const ZZ &productOfPrimes, ZZ* resultsArray, const bool IsItPrimeArray, long* caseStudy, long* caseStudyTracker, const ZZ &X0, const long &Roh){ 
int rc; 
pthread_t threads[numberOfRows]; 
struct parameters ThreadParameters[numberOfRows]; 

for(int i = 0; i< numberOfRows ; i++){ 
    FillR(rij,powRoh,rowLength); // fill up the vector rij with random numbers between 0 powRoh 
    MultiplyVectorByTwo(rij, rowLength, i, IsItPrimeArray); //Multiply rij vector by 2. If calculating Xi' also add 1 to appropriate values. 
    ThreadParameters[i].rij = rij; 
    ThreadParameters[i].rQ0 = rQ0; 
    ThreadParameters[i].primes = primes; 
    ThreadParameters[i].rowLength = rowLength; 
    ThreadParameters[i].Q0 = Q0; 
    ThreadParameters[i].i = i; 
    ThreadParameters[i].X0 = X0; 
    rc = pthread_create(&threads[i],NULL,CRTNew,(void *)&ThreadParameters[i]); 
    if(rc){ 
     cout << "Error: unable to create thread, " << rc << endl; 
     exit(-1); 
    } 
    for(long j = 0; j< rowLength; j++){ 
     cout << (resultsArray[i] % primes[j]) << " "; 
    } 
    cout << endl;*/ 

} 
for(int i = 0; i< numberOfRows; i++){ 
    pthread_join(threads[i], NULL); 
    resultsArray[i] = ThreadParameters[i].result; 
    } 
} 

的线程创建运行该功能

void* CRTNew(void *threadArg){ 
    struct parameters *local_data; 
    local_data = (struct parameters *) threadArg; 
    ZZ a, p, A, P, crt; 
    long Z, Public; 
    a = local_data->rQ0[local_data->i]; 
    p = local_data->Q0; 
    A = local_data->rij[0]; 
    P = local_data->primes[0]; 
    for(int i = 1; i<=local_data->rowLength; i++){ 
     A = A%P; 
     Z = CRT(a, p, A, P); 
     A = local_data->rij[i]; P = local_data->primes[i]; 
     if(i == local_data->rowLength) Public = Z; 
    } 
    if(a < 0) crt = a+p; 
    else crt = a%p; 
    local_data->result = crt%local_data->X0; 
    pthread_exit(NULL); 

}

+2

你能够使用C++ 11吗?如果是这样,我强烈推荐使用std :: thread和它的所有精彩的线程荣耀而不是pthread。 – Julian 2015-02-09 20:43:06

回答

0

“什么是设置线程数来优化处理器数量的最佳途径”;

1)在应用程序启动时创建[核心数量]线程(或者更多)。

2)不要产生任何更多的线程

3)不要让你的线程终止。

4)让他们按照池的方式等待生产者 - 消费者线程上的工作任务。

或者,使用已经工作的线程池类或等效的并行语言功能。