试图让N CPU保持运行线程

时间:2013-04-11 01:48:27

标签: pthreads cpu

我想在我的6核计算机中运行(比方说)25个CPU密集型任务,每次使用5个核心(因此剩下1个用于其他任务)。 25个CPU密集型任务中的每一个都可以在不同时间完成,例如一个任务可以在20分钟完成,而其他任务最多可能需要4个小时。

使用pthreads我设法构建了一个非常简单的算法,它可以启动5个线程,等待它完成并再次启动另外5个线程。该算法的缺点是它不能利用不同线程可能在不同时间完成的事实,而是在启动另一组之前总是等待所有5个线程的作业完成。

以下是启动线程的代码提取

#define MAX_REACTOR_THREADS 5

/* ....................... */
/* SOME LENGTHY STUFF HERE */
/* ....................... */

int cases = 25;
pthread_t *threads_REACTOR = calloc(cases, sizeof(pthread_t));

int index = 0;

/* CALL THREADS PROCEDURE FOR COMPUTING FUNCTION: REACTOR_THREAD */ 

int int_div = cases/MAX_REACTOR_THREADS;
int I, k;

for (I=0; I<int_div; I++){
/* LAUNCH THREADS */
for(k=0; k<MAX_REACTOR_THREADS; k++){

index = int_div*k+I;     
pthread_create(&threads_REACTOR[index], NULL, 
    &REACTOR_THREAD, (void*) &inputs_array[index]);
}
/* JOIN THREADS */
for(k=0; k<MAX_REACTOR_THREADS; k++){
  index = int_div*k+I;
  pthread_join(threads_REACTOR[index], NULL);
 }
/* HERE PRINT PROGRESS BAR */
Progress_Bar((I+1)*MAX_REACTOR_THREADS, cases, 40, COLOR_Y);
}

if((cases%MAX_REACTOR_THREADS) != 0){
/* LAUNCH REMAINING THREADS */
for(index=MAX_REACTOR_THREADS*int_div; index<cases; index++){
  pthread_create(&threads_REACTOR[index], NULL, 
         &REACTOR_THREAD, (void*) &inputs_array[index]);
}

/* JOIN REMAINING THREADS */
for(index=MAX_REACTOR_THREADS*int_div; index<cases; index++){
  pthread_join(threads_REACTOR[index], NULL);
  /* HERE PRINT PROGRESS BAR */
  Progress_Bar(index+1, cases, 40, COLOR_Y);
}
}  

/* ....................... */
/* SOME LENGTHY STUFF HERE */
/* ....................... */

如何改进,以便在线程完成工作时启动新任务?

0 个答案:

没有答案