【发布时间】:2019-05-01 17:46:04
【问题描述】:
我创建了一个程序,它使用 4 个线程将 8 个数字相加,然后是结果的乘积。如何确保每个线程都使用单独的内核以获得最大的性能增益。我是 pthreads 的新手,所以我真的不知道如何正确使用它。请提供尽可能简单的答案。
我的代码:
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
int global[9];
void *sum_thread(void *arg)
{
int *args_array;
args_array = arg;
int n1,n2,sum;
n1=args_array[0];
n2=args_array[1];
sum = n1*n2;
printf("N1 * N2 = %d\n",sum);
return (void*) sum;
}
void *sum_thread1(void *arg)
{
int *args_array;
args_array = arg;
int n3,n4,sum2;
n3=args_array[2];
n4=args_array[3];
sum2=n3*n4;
printf("N3 * N4 = %d\n",sum2);
return (void*) sum2;
}
void *sum_thread2(void *arg)
{
int *args_array;
args_array = arg;
int n5,n6,sum3;
n5=args_array[4];
n6=args_array[5];
sum3=n5*n6;
printf("N5 * N6 = %d\n",sum3);
return (void*) sum3;
}
void *sum_thread3(void *arg)
{
int *args_array;
args_array = arg;
int n8,n7,sum4;
n7=args_array[6];
n8=args_array[7];
sum4=n7*n8;
printf("N7 * N8 = %d\n",sum4);
return (void*) sum4;
}
int main()
{
int sum3,sum2,sum,sum4;
int prod;
global[0]=9220; global[1]=1110; global[2]=1120; global[3]=2320; global[4]=5100; global[5]=6720; global[6]=7800; global[7]=9290;// the input
pthread_t tid_sum;
pthread_create(&tid_sum,NULL,sum_thread,global);
pthread_join(tid_sum,(void*)&sum);
pthread_t tid_sum1;
pthread_create(&tid_sum1,NULL,sum_thread1,global);
pthread_join(tid_sum1,(void*)&sum2);
pthread_t tid_sum2;
pthread_create(&tid_sum2,NULL,sum_thread2,global);
pthread_join(tid_sum2,(void*)&sum3);
pthread_t tid_sum3;
pthread_create(&tid_sum3,NULL,sum_thread3,global);
pthread_join(tid_sum3,(void*)&sum4);
prod=sum+sum2+sum3+sum4;
printf("The sum of the products is: %d", prod);
return 0;
}
【问题讨论】:
-
您不信任操作系统中的调度程序?
-
您现在正在通过启动一个线程并等待它完成后再启动下一个线程来获得负面的性能提升。线程的全部意义在于并行运行它们。相反,您已经序列化了所有内容,并增加了线程创建的开销。
-
用连续的
pthread_create语句启动所有线程,然后等待它们用连续的pthread_join语句完成。pthread_join导致调用线程(在本例中为主线程)暂停,直到正在加入的线程完成工作。所以你所拥有的将启动tid_sum,然后等待它完成,然后启动tid_sum1,并等待它完成,等等。通常你希望同时启动所有工作线程,让它们并行工作,等他们稍后完成,然后巩固他们的工作。 -
就您的实际问题而言,我认为您已经超越了自己。您的操作系统调度程序将会非常擅长它所做的事情,即调度哪些进程在哪些内核上运行。除非你有更好的理由取代它,否则不要。您是否分析过代码的性能,但速度不够快?过早的优化会让你陷入困境。在这种情况下,您的代码都是序列化的,所以如果它太慢,请从并行化开始。如果您只是出于好奇,谷歌“处理器亲和力”,pthreads 支持。
-
您的所有线程都将大部分时间用于打印,这是它们无论如何不能同时进行的。