在我的程序中,我正在计算数组中的最小值。我这样做没有线程和线程。但是,我注意到,当我增加线程数时,程序运行的时间更长(我使用timeval来计算它)。这对我来说没有多大意义,这也是我第一次尝试用线程编程。关于导致这种情况的任何想法?
#include <stdlib.h>
#include<stdio.h>
#include<pthread.h>
#include<sys/time.h>
struct timeval start_time, stop_time;
#define N_items 100;
int num_threads = 1;
int start[100];
int x[4000];
int min[100];
pthread_t tid[100];
void *thread(void *arg)
{
int i, s;
double my_min;
s = *(int *) arg;
my_min = x[s];
for(i=s+num_threads; i<4000; i+= num_threads){
if(x[i]<my_min)
my_min = x[i];
}
min[s] = my_min;
return NULL;
}
int main(){
int i;
int my_min;
int elapsed;
//Create array of size 4000 with random numbers
for (i=0; i<4000; i++){
x[i] = random()%100+1;
}
gettimeofday(&start_time, NULL);
//Create threads
for(i = 0; i<num_threads; i++){
start[i] = i;
if ( pthread_create(&tid[i], NULL, thread, (void *)&start[i]) ) {
printf("Can't create thread\n");
}
}
for(i = 0; i<num_threads; i++){
pthread_join(tid[i], NULL);
}
my_min = min[0];
for(i = 0; i<num_threads; i++) {
if(min[i]<my_min)
my_min = min[i];
}
gettimeofday(&stop_time, NULL);
printf("min is: %d\n", my_min);
elapsed = (stop_time.tv_sec*1000000+ stop_time.tv_usec) -
(start_time.tv_sec*1000000+ start_time.tv_usec);
printf("Elapsed time is: %d\n", elapsed );
}
答案 0 :(得分:2)
创建和销毁一个线程只是为了进行4000次快速操作是没有意义的。你在测量开销,而不是工作。
答案 1 :(得分:1)
你做错的另一件事是i += num_threads
。有效地使用CPU缓存非常重要,而你在那里做的就是浪费它。
您希望使用实体顺序访问块而不是遍布整个地方。也许尝试(未经测试):
int count = 4000;
int chunk = count / num_threads;
int start = s * chunk;
int end = start + chunk;
for(int i = start; i < end; ++i)