调查问卷:测试你对多核多线程的认知程度

本文通过一个C++程序展示了多核多线程的概念,使用了`pthread`库来测试计算性能。代码中计算了一个大整数数组的累加和,以展示对CPU资源的利用和优化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

测试你对多核多线程的认知程度


        目前,多核多线程编程已经成为一种趋势,但大部分程序员还没有从串行程序的思维中走出来。即使有些人对多核多线程的概念有所了解,但也是一知半解,写起多核多线程程序来总是束手束脚。

        据Intel预测,到2013年CPU将达到256核。掐指头算一算,也就是还有5年的时间,但留给我们程序员的时间却很少了。这不是危言耸听,现实情况确实如此。如果从现在就开始重视这一问题,不断的学习,并加以积累,相信不久的将来,也许你就比别人多了一次机会。

        我曾经对周围的朋友做过一次有趣的调查,调查对象都曾有过多线程编码经验,以此来了解大家对多核与多线程的认知程度。当然不可否认,由于自身知识水平的有限,问卷存在一定的片面性。

        样例程序:
  1. #ifdef __cplusplus
  2. extern "C"
  3. {
  4. #endif
  5. #include <stdio.h>
  6. #include <sys/types.h>
  7. #include <sys/time.h>
  8. #include <pthread.h>
  9. #include <unistd.h>
  10.     
  11. #define ORANGE_MAX_VALUE       1000000
  12. #define APPLE_MAX_VALUE           100000000
  13. #define MSECOND                         1000000
  14. struct apple
  15. {
  16.     unsigned long long a;
  17.     unsigned long long b;
  18. };

  19. struct orange
  20. {
  21.     int a[ORANGE_MAX_VALUE];
  22.     int b[ORANGE_MAX_VALUE];
  23.     
  24. };

  25. int main (int argc, const char * argv[]) {
  26.     // insert code here...
  27.     struct apple test;
  28.     struct orange test1={{0},{0}};
  29.     
  30.     unsigned long long sum=0,index=0;
  31.     struct timeval tpstart,tpend;
  32.     float  timeuse; 
  33.     
  34.     test.a= 0;
  35.     test.b= 0;
  36.     
  37.     /*get start time*/
  38.     gettimeofday(&tpstart,NULL); 
  39.     
  40.     for(sum=0;sum<APPLE_MAX_VALUE;sum++)
  41.     {
  42.         test.a += sum;
  43.         test.b += sum;
  44.     }
  45.     
  46.     for(index=0;index<ORANGE_MAX_VALUE;index++)
  47.     {
  48.         sum=test1.a[index]+test1.b[index];
  49.     }
  50.     /*get start time*/
  51.     gettimeofday(&tpend,NULL); 
  52.     
  53.     /*calculate time*/
  54.     timeuse=MSECOND*(tpend.tv_sec-tpstart.tv_sec)+tpend.tv_usec-tpstart.tv_usec; 
  55.     timeuse/=MSECOND; 
  56.     printf("main thread:%x,Used Time:%f/n",pthread_self(),timeuse); 
  57.     
  58.     printf("a = %llu,b = %llu,sum=%llu/n",test.a,test.b,sum);
  59.     
  60.     return 0;
  61. }
  62.     
  63. #ifdef __cplusplus
  64. }
  65. #endif

        假设有一台酷睿2代双核机器,在此机器上对上述程序进行如下优化,您会如何选择呢?

        Q1: 您认为样例程序还有优化的空间吗? 如果有,优化后的效率将会提升:
        A.  1%~30%              B.  30%~50%              C. 50%~90%              D.  90%以上         


        Q2: 如果将样例程序修改为两个线程,一个线程用于计算apple的和,另外一个线程计算orange的和,您认为谁的效率会更高?
        A.  两线程              B.  单线程(样例程序)              C. 不确定


        Q3:  基于Q2,再将计算apple的线程拆成两个线程,一个线程用于计算apple a的值(加锁访问),另外一个线程计算apple b的值(加锁访问),第三个线程计算orange的和,您认为谁的效率会更高?
        A.  两线程        B.  单线程(样例程序)        C. 三线程         D.  不确定


        Q4:  基于Q2,在双核CPU系统上,将计算apple的线程绑定到 CPU 0上运行,将计算orange和的线程绑定到 CPU 1上运行,这种方法称为设置CPU亲和力( CPU  Affinity ,也叫 CPU 绑定) 您认为谁的效率会更高?
        A.  两线程     B.  单线程(样例程序)    C. 两线程(CPU绑定)     D.  不确定


        Q5:  经过分析发现计算orange的和比较快,而计算apple的和比较慢。 基于Q3,将计算apple a的线程和计算orange和的线程绑定到CPU 0上运行,将计算apple b的线程绑定到 CPU 1上运行, 您认为谁的效率会更高?
        A.  三线程     B.  单线程(样例程序)    C. 三线程(CPU绑定)     D.  不确定


        Q6:  在Q3中,将程序拆成多线程,需要加锁来访问apple a和b的值,但由于他们访问的是数据结构中的不同属性,也可以不加锁, 此时您认为谁的效率会更高?
        A.  加锁访问          B.  不加锁访问          C. 不确定

       
         如果有兴趣的读者,想知道问题的答案,可以看看我的拙作《 利用多核多线程进行程序优化》。

         另外一篇文章还在创作过程中,也是针对本文的样例程序进程一系列的优化,效率最终提升了92%。

         欢迎大家拍砖!



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值