`
dowhathowtodo
  • 浏览: 829737 次
文章分类
社区版块
存档分类
最新评论

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

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


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

据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. #defineORANGE_MAX_VALUE 1000000
  11. #defineAPPLE_MAX_VALUE100000000
  12. #defineMSECOND 1000000
  13. structapple
  14. {
  15. unsignedlonglonga;
  16. unsignedlonglongb;
  17. };

  18. structorange
  19. {
  20. inta[ORANGE_MAX_VALUE];
  21. intb[ORANGE_MAX_VALUE];
  22. };

  23. intmain(intargc,constchar*argv[]){
  24. //insertcodehere...
  25. structappletest;
  26. structorangetest1={{0},{0}};
  27. unsignedlonglongsum=0,index=0;
  28. structtimevaltpstart,tpend;
  29. floattimeuse;
  30. test.a=0;
  31. test.b=0;
  32. /*getstarttime*/
  33. gettimeofday(&tpstart,NULL);
  34. for(sum=0;sum<APPLE_MAX_VALUE;sum++)
  35. {
  36. test.a+=sum;
  37. test.b+=sum;
  38. }
  39. for(index=0;index<ORANGE_MAX_VALUE;index++)
  40. {
  41. sum=test1.a[index]+test1.b[index];
  42. }
  43. /*getstarttime*/
  44. gettimeofday(&tpend,NULL);
  45. /*calculatetime*/
  46. timeuse=MSECOND*(tpend.tv_sec-tpstart.tv_sec)+tpend.tv_usec-tpstart.tv_usec;
  47. timeuse/=MSECOND;
  48. printf("mainthread:%x,UsedTime:%f/n",pthread_self(),timeuse);
  49. printf("a=%llu,b=%llu,sum=%llu/n",test.a,test.b,sum);
  50. return0;
  51. }
  52. #ifdef__cplusplus
  53. }
  54. #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%。

欢迎大家拍砖!



分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics