使用合并排序实现了具有1000000个节点的三个链表的多进程和多线程实现。 我比较了已实现程序的实时性,但是多线程方法比较慢。 为什么呢?
process.c中的主要方法
/* Insert nodes */
Node* tmp = NULL;
int num;
for( int i = 0; i < MAX; i++ )
{
fscanf(fread,"%d",&num);
tmp = createNode(num , i );
insertNode( &list1.head, &list1.tail, tmp );
tmp = createNode(num , i );
insertNode( &list2.head, &list2.tail, tmp );
tmp = createNode(num , i );
insertNode( &list3.head, &list3.tail, tmp );
tmp = createNode(num , i );
}
free( tmp );
fclose(fread);
if ((t1 = times(&mytms)) == -1) {
perror("times 1");
exit(1);
}
pid1= fork();
if(pid1==0){
mergeSort( &list1.head );
file_output(&list1);
freeAll( list1.head );
exit(1);
}
pid2= fork();
if(pid2==0){
mergeSort( &list2.head );
file_output(&list2);
freeAll( list2.head );
exit(2);
}
pid3 = fork();
if(pid3==0){
mergeSort( &list3.head );
file_output(&list3);
freeAll( list3.head );
exit(3);
}
wait(&status);
wait(&status);
wait(&status);
if ((t2 = times(&mytms)) == -1) {
perror("times 2");
exit(1);
}
printf("Real time : %.5f sec\n", (double)(t2 - t1) / CLK_TCK);
printf("User time : %.5f sec\n", (double)mytms.tms_utime / CLK_TCK);
printf("System time : %.5f sec\n", (double)mytms.tms_stime / CLK_TCK);
结果 实时:1.65
main in thread.c
/* Insert nodes */
Node* tmp = NULL;
int num;
for( int i = 0; i < MAX; i++ )
{
fscanf(fread,"%d",&num);
tmp = createNode(num , i );
insertNode( &list1.head, &list1.tail, tmp );
tmp = createNode(num , i );
insertNode( &list2.head, &list2.tail, tmp );
tmp = createNode(num , i );
insertNode( &list3.head, &list3.tail, tmp );
}
free( tmp );
fclose(fread);
if ((t1 = times(&mytms)) == -1) {
perror("times 1");
exit(1);
}
pthread_create( &t_id1, NULL, thread_func, &list1 );
pthread_create( &t_id2, NULL, thread_func, &list2 );
pthread_create( &t_id3, NULL, thread_func, &list3 );
pthread_join( t_id1, (void*)&status );
pthread_join( t_id2, (void*)&status );
pthread_join( t_id3, (void*)&status );
if ((t2 = times(&mytms)) == -1) {
perror("times 2");
exit(1);
}
printf("Real time : %.5f sec\n", (double)(t2 - t1) / CLK_TCK);
printf("User time : %.5f sec\n", (double)mytms.tms_utime / CLK_TCK);
printf("System time : %.5f sec\n", (double)mytms.tms_stime / CLK_TCK);
结果 实时2.27
答案 0 :(得分:-1)
为什么多线程速度较慢?
它是处理器特定的,并与cores的数量,CPU caches的组织,其cache coherence和您的RAM有关。另请参见https://www.phoronix.com/上的测试和基准测试;在Intel Core i7 10700K和AMD Ryzen 9 3900X(价格接近)上将是不同的。
它也是compiler和optimization specific。阅读Dragon book和一个不错的book on Computer Architecture。
这还取决于您的特定operating system和您的特定C standard library(例如GNU glibc与musl-libc不同),并且glibc 2.31
可以有不同性能比相同计算机上的glibc 2.30
高。阅读Advanced Linux Programming,pthreads(7),nptl(7),numa(7),time(7),madvise(2),syscalls(2)
您是否尝试过至少使用最近调用过GCC 10 gcc -Wall -O3 -mtune=native
的最新as的最新Linux?
您可以在Linux上先使用proc(5),然后再使用hwinfo查询硬件。
您可能对OpenCL,OpenMP或OpenACC感兴趣,并且应该阅读有关特定C编译器的优化选项的信息。有关最近的GCC,请参见this。您甚至可以使用GCC plugins自定义最新的GCC以改进优化,还可以尝试使用最新的Clang或icc编译器。
另请参阅MILEPOST GCC项目和CTuning one。另请阅读this draft报告。参加ACM SIGPLAN和SIGOPS会议。与您附近的计算机科学学者联系。
您可能会在理解问题答案的同时获得博士学位。