免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: wang290
打印 上一主题 下一主题

[技术动态] Linus Torvalds :忘掉那该死的并行吧! [复制链接]

论坛徽章:
12
巳蛇
日期:2013-09-16 15:32:242015年辞旧岁徽章
日期:2015-03-03 16:54:152015年亚洲杯之约旦
日期:2015-02-11 14:38:37双鱼座
日期:2015-01-05 11:05:47戌狗
日期:2014-12-08 09:41:18戌狗
日期:2014-08-15 09:29:29双子座
日期:2014-08-05 09:17:17卯兔
日期:2014-06-08 15:32:18巳蛇
日期:2014-01-27 08:47:08白羊座
日期:2013-11-28 21:04:15巨蟹座
日期:2013-11-13 21:58:012015年亚洲杯之科威特
日期:2015-04-17 16:51:51
21 [报告]
发表于 2015-01-12 16:51 |只看该作者
回复 18# windoze


    维基百科上的文字和我记忆里是相符的:
  1. The cores of Intel MIC are based on a modified version of P54C design, used in the original Pentium.[48] The basis of the Intel MIC architecture is to leverage x86 legacy by creating a x86-compatible multiprocessor architecture that can utilize existing parallelization software tools.[20] Programming tools include OpenMP, OpenCL,[49] Cilk/Cilk Plus and specialised versions of Intel's Fortran, C++[50] and math libraries.[51]
复制代码
从奔腾的核心修改的,可以直接跑之前的程序。

论坛徽章:
15
射手座
日期:2014-11-29 19:22:4915-16赛季CBA联赛之青岛
日期:2017-11-17 13:20:09黑曼巴
日期:2017-07-13 19:13:4715-16赛季CBA联赛之四川
日期:2017-02-07 21:08:572015年亚冠纪念徽章
日期:2015-11-06 12:31:58每日论坛发贴之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-07-12 22:20:002015亚冠之浦和红钻
日期:2015-07-08 10:10:132015亚冠之大阪钢巴
日期:2015-06-29 11:21:122015亚冠之广州恒大
日期:2015-05-22 21:55:412015年亚洲杯之伊朗
日期:2015-04-10 16:28:25
22 [报告]
发表于 2015-01-12 16:54 |只看该作者
zhaohongjian000 发表于 2015-01-12 16:27
回复 16# windoze

我们的技术,几十核没啥问题。上千的核?还真是挑战,得继续研究。

论坛徽章:
4
水瓶座
日期:2013-09-06 12:27:30摩羯座
日期:2013-09-28 14:07:46处女座
日期:2013-10-24 14:25:01酉鸡
日期:2014-04-07 11:54:15
23 [报告]
发表于 2015-01-12 20:10 |只看该作者
对于并行软件开发模式,锁最终会是瓶颈,随着cpu个数增多,性能无法线性。

不过这不是说没法提高了,只是不能再依靠mutex+shared_ptr搞并发了,必须靠副本,消息机制,就像erlang所倡导的那样。

论坛徽章:
6
CU大牛徽章
日期:2013-03-14 14:14:08CU大牛徽章
日期:2013-03-14 14:14:26CU大牛徽章
日期:2013-03-14 14:14:29处女座
日期:2014-04-21 11:51:59辰龙
日期:2014-05-12 09:15:10NBA常规赛纪念章
日期:2015-05-04 22:32:03
24 [报告]
发表于 2015-01-13 13:41 |只看该作者
linux_c_py_php 发表于 2015-01-12 20:10
对于并行软件开发模式,锁最终会是瓶颈,随着cpu个数增多,性能无法线性。

不过这不是说没法提高了,只是 ...


大神是典型的工程师作风,往往不屑那些学院派,比如洪内核和微内核之争,大神还是很鄙视那些教授们的

论坛徽章:
44
15-16赛季CBA联赛之浙江
日期:2021-10-11 02:03:59程序设计版块每日发帖之星
日期:2016-07-02 06:20:0015-16赛季CBA联赛之新疆
日期:2016-04-25 10:55:452016科比退役纪念章
日期:2016-04-23 00:51:2315-16赛季CBA联赛之山东
日期:2016-04-17 12:00:2815-16赛季CBA联赛之福建
日期:2016-04-12 15:21:2915-16赛季CBA联赛之辽宁
日期:2016-03-24 21:38:2715-16赛季CBA联赛之福建
日期:2016-03-18 12:13:4015-16赛季CBA联赛之佛山
日期:2016-02-05 00:55:2015-16赛季CBA联赛之佛山
日期:2016-02-04 21:11:3615-16赛季CBA联赛之天津
日期:2016-11-02 00:33:1215-16赛季CBA联赛之浙江
日期:2017-01-13 01:31:49
25 [报告]
发表于 2015-01-13 14:24 |只看该作者
回复 22# yulihua49

上千核的程序就不是这么写了……

论坛徽章:
15
射手座
日期:2014-11-29 19:22:4915-16赛季CBA联赛之青岛
日期:2017-11-17 13:20:09黑曼巴
日期:2017-07-13 19:13:4715-16赛季CBA联赛之四川
日期:2017-02-07 21:08:572015年亚冠纪念徽章
日期:2015-11-06 12:31:58每日论坛发贴之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-07-12 22:20:002015亚冠之浦和红钻
日期:2015-07-08 10:10:132015亚冠之大阪钢巴
日期:2015-06-29 11:21:122015亚冠之广州恒大
日期:2015-05-22 21:55:412015年亚洲杯之伊朗
日期:2015-04-10 16:28:25
26 [报告]
发表于 2015-01-13 19:35 |只看该作者
windoze 发表于 2015-01-13 14:24
回复 22# yulihua49

上千核的程序就不是这么写了……

提示一下,怎么玩?

论坛徽章:
44
15-16赛季CBA联赛之浙江
日期:2021-10-11 02:03:59程序设计版块每日发帖之星
日期:2016-07-02 06:20:0015-16赛季CBA联赛之新疆
日期:2016-04-25 10:55:452016科比退役纪念章
日期:2016-04-23 00:51:2315-16赛季CBA联赛之山东
日期:2016-04-17 12:00:2815-16赛季CBA联赛之福建
日期:2016-04-12 15:21:2915-16赛季CBA联赛之辽宁
日期:2016-03-24 21:38:2715-16赛季CBA联赛之福建
日期:2016-03-18 12:13:4015-16赛季CBA联赛之佛山
日期:2016-02-05 00:55:2015-16赛季CBA联赛之佛山
日期:2016-02-04 21:11:3615-16赛季CBA联赛之天津
日期:2016-11-02 00:33:1215-16赛季CBA联赛之浙江
日期:2017-01-13 01:31:49
27 [报告]
发表于 2015-01-13 20:31 |只看该作者
回复 26# yulihua49

妥妥的MPI+并行算法,目前没有什么更好的办法。

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
28 [报告]
发表于 2015-01-13 22:33 |只看该作者
回复 26# yulihua49

正在吐血调试的一段,并行在四块显卡上,有 2880 + 2496 + 2496 + 2496 个核

  1. __global__ void
  2. make_individual_pattern_intensity_diff( double* cuda_ug, unsigned long* cuda_ar, double* cuda_diag, double thickness, unsigned long* cuda_dim, double* cuda_I_exp, double* cuda_I_diff, unsigned long column_index, double2* cuda_cache, unsigned long max_dim, unsigned long tilt_size )
  3. {
  4.     unsigned long const tilt_index = blockDim.x * blockIdx.x + threadIdx.x;

  5.     if ( tilt_index >= tilt_size ) return;

  6.     unsigned long const dim = *(cuda_dim + tilt_index);
  7.     double* ug = cuda_ug;
  8.     unsigned long* ar = cuda_ar + tilt_index * max_dim * max_dim;
  9.     double* diag = cuda_diag + tilt_index * max_dim;
  10.     double* I_exp = cuda_I_exp + tilt_index * max_dim;
  11.     double* I_diff = cuda_I_diff + tilt_index * max_dim;
  12.     double2* cache = cuda_cache + 6 * tilt_index * max_dim * max_dim;

  13.         unsigned long dimdim = dim*dim;

  14.         //cache should be of size 6*N^2
  15.         double2* a_ = cache;
  16.         double2* aa_ = a_ + dimdim;
  17.         double2* aaa_ = aa_ + dimdim;
  18.         double2* p1 = aaa_ + dimdim;
  19.         double2* p2 = p1 + dimdim;
  20.         double2* p3 = p2 + dimdim;

  21.         //reuse memory in latter steps, when a_, aa_ and aaa_ are idle
  22.         double2* p2p3 = a_;
  23.         double2* s = aa_;
  24.         double2* s_ = aaa_;

  25.         //1)
  26.         kernel_assert( (compose_a<<<1, dim>>>( ug, ar, diag, thickness, a_, dim )) );
  27.     cuda_assert( cudaDeviceSynchronize() );

  28.         //2)
  29.     //TODO
  30.     double* the_norm = (double*)aa_;
  31.     kernel_assert( (Dznrm2<<<1,128>>>( dimdim, a_, the_norm )) );
  32.     //kernel_assert( (Dasum<<<1,128>>>( dimdim, a_, the_norm )) );
  33.     cuda_assert( cudaDeviceSynchronize() );

  34.         //double const ratio = (*the_norm) * 53.71920351148152;
  35.         double const ratio = (*the_norm) / 5.371920351148152;
  36.         unsigned long const scaler = ratio < 1.0 ? 0 : ceil(log2(ratio));
  37.         unsigned long const scaling_factor =  1 << scaler;
  38.         double const scale = scaling_factor;
  39.         kernel_assert( (Zscal<<<1, 128>>>( dimdim, 1.0/scale, a_ )) );    //a_ /= scale
  40.     cuda_assert( cudaDeviceSynchronize() );

  41.         //3)
  42.     dim3 const mm_grids( (dim+15)/16, (dim+15)/16 );
  43.     dim3 const mm_threads( 16, 16 );
  44.     kernel_assert( (Zgemm<<<mm_grids, mm_threads>>>( aa_, a_, a_, dim, 1.0 )) );
  45.     cuda_assert( cudaDeviceSynchronize() );
  46.     kernel_assert( (Zgemm<<<mm_grids, mm_threads>>>( aaa_, aa_, a_, dim, 1.0 )) );
  47.     cuda_assert( cudaDeviceSynchronize() );

  48.         //4)
  49.         /*solve(_Z^9+9*_Z^8+72*_Z^7+504*_Z^6+3024*_Z^5+15120*_Z^4+60480*_Z^3+181440*_Z^2+362880*_Z+362880 = 0)
  50.          * Returns:
  51.          *  2.697333461536989227389605+5.184162062649414177834087*I,     //c1
  52.          *  -.3810698456631129990312942+4.384644533145397950369203*I,    //c2
  53.          *  -2.110839800302654737498705+3.089910928725500922777702*I,    //c3
  54.          *  -3.038648072936697089212469+1.586801195758838328803868*I,    //c4
  55.          *  -3.333551485269048803294274,                                 //c5
  56.          *  -3.038648072936697089212469-1.586801195758838328803868*I,    //c6
  57.          *  -2.110839800302654737498705-3.089910928725500922777702*I,    //c7
  58.          *  -.3810698456631129990312942-4.384644533145397950369203*I,    //c8
  59.          *  2.697333461536989227389605-5.184162062649414177834087*I             //c9
  60.          *
  61.          *  expand((x-c1)*(x-c2)*(x-c3))  >> p1                                                                                                   (                     p1_c                             )
  62.          *          x^3-.205423815571221490859606*x^2-(12.65871752452031305098099*I)*x^2-58.21460179641193947200471*x-(3.189848964212376356715960*I)*x-19.71085376106750328141397+94.20645646169128946503649*I
  63.          *
  64.          *  expand((x-c4)*(x-c5)*(x-c6))  >> p2   (         p2_c            )
  65.          *          x^3+9.410847631142442981719212*x^2+39.17363072664900708597702-6.123261017392618755198919*10^(-24)*I+32.01029973951970099352671*x+(4.*10^(-24)*I)*x
  66.          *
  67.          *  expand((x-c7)*(x-c8)*(x-c9))  >> p3                                                                                                  (                         p3_c                         )
  68.          *          x^3-.205423815571221490859601*x^2+(12.65871752452031305098099*I)*x^2-58.21460179641193947200470*x+(3.18984896421237635671600*I)*x-19.71085376106750328141404-94.20645646169128946503646*I
  69.          *
  70.          *  expand((x-c1)*(x-c2)*(x-c3)*(x-c4)*(x-c5)*(x-c6)*(x-c7)*(x-c8)*(x-c9))
  71.          *          3.628800000000000000000003*10^5-1.365022562699469279472268*10^(-19)*I+3.628800000000000000000003*10^5*x+x^9+9.00000000000000000000000*x^8+72.00000000000000000000006*x^7+503.9999999999999999999995*x^6+3024.000000000000000000002*x^5+15120.00000000000000000000*x^4+60479.99999999999999999995*x^3+1.814400000000000000000001*10^5*x^2-(5.*10^(-22)*I)*x^6-(1.*10^(-20)*I)*x^4-(1.0*10^(-19)*I)*x^3+(2.*10^(-24)*I)*x^8-(3.0*10^(-19)*I)*x^2-(7.*10^(-21)*I)*x^5-(4.*10^(-19)*I)*x+(2.*10^(-23)*I)*x^7
  72.          */
  73.         //4 - p1)
  74.     kernel_assert( (Zcopy<<<1,128>>>( dimdim, aaa_, p1 )) );
  75.     cuda_assert( cudaDeviceSynchronize() );
  76.     kernel_assert( (Zaxpy<<<1,128>>>( dimdim, -0.205423815571221490859606, -12.65871752452031305098099, p1, aa_ )) );
  77.     cuda_assert( cudaDeviceSynchronize() );
  78.     kernel_assert( (Zaxpy<<<1,128>>>( dimdim, -58.21460179641193947200471, -3.189848964212376356715960, p1, a_ )) );
  79.     cuda_assert( cudaDeviceSynchronize() );
  80.         kernel_assert( (sum_diag<<<1,dim>>>( p1, dim, -19.71085376106750328141397, 94.20645646169128946503649 )) );
  81.     cuda_assert( cudaDeviceSynchronize() );

  82.         //4 - p2)
  83.     kernel_assert( (Zcopy<<<1,128>>>( dimdim, aaa_, p2 )) );
  84.     cuda_assert( cudaDeviceSynchronize() );
  85.     kernel_assert( (Zaxpy<<<1,128>>>( dimdim, 9.410847631142442981719212, 0.0, p2, aa_ )) );
  86.     cuda_assert( cudaDeviceSynchronize() );
  87.     kernel_assert( (Zaxpy<<<1,128>>>( dimdim, 32.01029973951970099352671, 0.0, p2, a_ )) );
  88.     cuda_assert( cudaDeviceSynchronize() );
  89.         kernel_assert( (sum_diag<<<1,dim>>>( p2, dim, 39.17363072664900708597702, 0.0  )) );
  90.     cuda_assert( cudaDeviceSynchronize() );

  91.         //4 - p3)
  92.     kernel_assert( (Zcopy<<<1,128>>>( dimdim, aaa_, p3 )) );
  93.     cuda_assert( cudaDeviceSynchronize() );
  94.     kernel_assert( (Zaxpy<<<1,128>>>( dimdim, -0.205423815571221490859601, 12.65871752452031305098099, p3, aa_ )) );
  95.     cuda_assert( cudaDeviceSynchronize() );
  96.     kernel_assert( (Zaxpy<<<1,128>>>( dimdim, -58.21460179641193947200470, 3.18984896421237635671600, p3, a_ )) );
  97.     cuda_assert( cudaDeviceSynchronize() );
  98.         kernel_assert( (sum_diag<<<1,dim>>>( p3, dim, -19.71085376106750328141404, -94.20645646169128946503646 )) );
  99.     cuda_assert( cudaDeviceSynchronize() );

  100.         //4 - s)
  101.         // s = 1/602.39521910453439454428( p1 * ( 1/602.39521910453439454428 * p2 * p3 ) ) = (p1 p2 p3)/362880
  102.     kernel_assert( (Zgemm<<<mm_grids, mm_threads>>>( p2p3, p2, p3, dim, 0.0016600397351866578333 )) );
  103.     cuda_assert( cudaDeviceSynchronize() );
  104.     kernel_assert( (Zgemm<<<mm_grids, mm_threads>>>( s, p1, p2p3, dim, 0.0016600397351866578333 )) );
  105.     cuda_assert( cudaDeviceSynchronize() );

  106.         //5)
  107.         for ( unsigned long index = 0; index != scaler; ++index )
  108.                 {
  109.             kernel_assert( (Zgemm<<<mm_grids, mm_threads>>>( s_, s, s, dim, 1.0 )) );
  110.                 cuda_assert( cudaDeviceSynchronize() );
  111.                         double2* tmp = s_;
  112.                         s_ = s;
  113.                         s = tmp;
  114.                 }


  115.         //6)
  116.         //kernel_assert( (extract_intensity_diff<<<1,dim>>>( s, I_exp, I_diff, dim, column_index )) );
  117.     double const ac_offset = cuda_ug[0];
  118.     double const dc_offset = cuda_ug[1];
  119.         kernel_assert( (extract_intensity_diff_with_offset<<<1,dim>>>( s, I_exp, I_diff, dim, column_index, ac_offset, dc_offset )) );
  120.         cuda_assert( cudaDeviceSynchronize() );
复制代码

论坛徽章:
15
射手座
日期:2014-11-29 19:22:4915-16赛季CBA联赛之青岛
日期:2017-11-17 13:20:09黑曼巴
日期:2017-07-13 19:13:4715-16赛季CBA联赛之四川
日期:2017-02-07 21:08:572015年亚冠纪念徽章
日期:2015-11-06 12:31:58每日论坛发贴之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-07-12 22:20:002015亚冠之浦和红钻
日期:2015-07-08 10:10:132015亚冠之大阪钢巴
日期:2015-06-29 11:21:122015亚冠之广州恒大
日期:2015-05-22 21:55:412015年亚洲杯之伊朗
日期:2015-04-10 16:28:25
29 [报告]
发表于 2015-01-14 13:18 |只看该作者
lost_templar 发表于 2015-01-13 22:33
回复 26# yulihua49

正在吐血调试的一段,并行在四块显卡上,有 2880 + 2496 + 2496 + 2496 个核

没看懂,cuda是啥,你要介绍一下,你那个程序的功能是啥。

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
30 [报告]
发表于 2015-01-14 17:41 |只看该作者
yulihua49 发表于 2015-01-14 13:18
没看懂,cuda是啥,你要介绍一下,你那个程序的功能是啥。


量子力学的东西,没指望你能看懂
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP