【发布时间】:2015-04-19 22:31:47
【问题描述】:
我正在编写一个多线程程序来遍历一个n x n矩阵,其中主对角线中的元素是并行处理的,如下代码所示:
int main(int argc, char * argv[] )
{
/* VARIABLES INITIALIZATION HERE */
gettimeofday(&start_t, NULL); //start timing
for (int slice = 0; slice < 2 * n - 1; ++slice)
{
z = slice < n ? 0 : slice - n + 1;
int L = 0;
pthread_t threads[slice-z-z+1];
struct thread_data td[slice-z-z+1];
for (int j=z; j<=slice-z; ++j)
{
td[L].index= L;
printf("create:%d\n", L );
pthread_create(&threads[L],NULL,mult_thread,(void *)&td[L]);
L++;
}
for (int j=0; j<L; j++)
{
pthread_join(threads[j],NULL);
}
}
gettimeofday(&end_t, NULL);
printf("Total time taken by CPU: %ld \n", ( (end_t.tv_sec - start_t.tv_sec)*1000000 + end_t.tv_usec - start_t.tv_usec));
return (0);
}
void *mult_thread(void *t)
{
struct thread_data *my_data= (struct thread_data*) t;
/* SOME ADDITIONAL CODE LINES HERE */
printf("ThreadFunction:%d\n", (*my_data).index );
return (NULL);
}
问题在于,与串行(幼稚)实现相比,这种多线程实现给了我非常糟糕的性能。
是否可以进行一些调整来提高多线程版本的性能?
【问题讨论】:
-
您是否尝试过识别可能受益于多线程执行的代码部分?向程序添加更多线程并不会自动使其更快。
-
每个线程完成的任务是否足够大以克服开销?此外,使用最大数量的线程可能是一个想法,因为您的系统只能处理 4、8、16 等线程
-
我可以想象单线程版本从缓存中受益,而多线程版本则不能,因为内存访问是随机进入的。看看this question。也许尝试将矩阵存储为对角线?
-
创建一个新线程也有一定的成本。如果“这里的一些附加代码行”中的成本不比线程创建的成本高多少,它甚至可能会使性能变差。你可以先创建一些线程(2 * cpu 线程,以我的经验),然后写给你任务到队列或其他结构。
-
您错过了@RobertHarvey 和其他人提出的观点。使用多线程不会自动提高性能。在某些情况下,它甚至会导致性能下降。向我们展示“附加代码行”。没有它,没有人可以告诉您是否做错了什么不会导致性能提升,或者您尝试解决的问题是否没有从多线程中受益。
标签: c linux multithreading matrix