设为首页收藏本站

爱吱声

 找回密码
 注册
搜索
查看: 8055|回复: 25
打印 上一主题 下一主题

[信息技术] C++ 提速的新发现

[复制链接]
  • TA的每日心情

    2025-9-22 22:19
  • 签到天数: 1183 天

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2022-9-24 22:54:26 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
    C++ 比 Octave 慢好多,怎么破?1 c' E2 l/ E9 D; [6 e

    , e& \8 z# y9 K, u4 o8 m) f自相关两层循环,内层循环涉及浮点数计算,试验了一下把内层循环内部全都 comment out 只留个壳子,  但空的内层循环本身就把速度拉下来了,看来问题并不在浮点计算。. q5 V7 M7 k0 j' \8 x

    9 N& C: n- b1 B  w( O2 G  g速度优化问题真的很有意思啊。8 _: s. T- l- H; j# h
    . s9 k0 n4 j" d& B2 Q. u! I3 b
    欢迎大家继续讨论

    评分

    参与人数 2爱元 +8 收起 理由
    helloworld + 4
    住在乡下 + 4 涨姿势

    查看全部评分

  • TA的每日心情
    开心
    2026-2-7 02:13
  • 签到天数: 1955 天

    [LV.Master]无

    沙发
    发表于 2022-9-24 23:04:16 | 只看该作者
    拉下来?拉多少?+ q, ?4 P4 Q  x! h1 n4 s$ K4 h
    把代码贴上来看看?6 x9 q& i- E# i# q% H4 Q! d5 C7 t4 \
    2 N5 ~4 Y- O* ]. |% U8 x% w: h
    难道分支预测不准破坏流水线执行?不该啊。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    板凳
    发表于 2022-9-24 23:15:41 | 只看该作者
    会不会代码本身的缺陷阻止了自动优化?另外,硬件配置和开发环境可能也有关系。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2026-2-24 07:04
  • 签到天数: 126 天

    [LV.7]分神

    地板
    发表于 2022-9-24 23:33:02 | 只看该作者
    Maybe Debug mode?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

    2025-9-22 22:19
  • 签到天数: 1183 天

    [LV.10]大乘

    5#
     楼主| 发表于 2022-9-24 23:54:10 | 只看该作者
    本帖最后由 雷达 于 2022-9-24 23:57 编辑
    ; I' A/ v% k2 G% @4 I5 F6 x
    数值分析 发表于 2022-9-24 23:04
    6 d  h' e( [. f5 P4 w" k: N拉下来?拉多少?7 a  f% v" v$ f- h% s4 {  z2 y
    把代码贴上来看看?

    ) w. j5 v! j# o8 \  m, S0 i% E( T. G
    6 W2 N$ l8 N7 @0 o! avoid xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)" C4 K: z" a; y) m) x3 S
    {
    0 m; o! L8 x" i  Z5 L        comp temp, xtimesy;
    $ D8 z. M, I1 V: C# [        xtimesy.re = 0;  A2 g' ^, _9 d3 K* }
            xtimesy.im = 0;
    : j% U% w# R: m# F        int j0 = lenB - 1;0 f: D7 C# ^+ N" ]/ I
            int    i, j, i1, reali;
    1 u' s  J& Z/ l2 v9 I        if (lenA % 2 == 1)  J$ U; l& E2 K1 d7 ~+ H
                    reali = lenA + 1;2 J* }$ m+ h. V! U. T; ^
            else
      m: p- o  H) t- C9 m8 W2 A                reali = lenA;
    4 o% W- |- P( B- c* ^" V% g" L        reali /= 2;
    2 y/ `; o* k9 Z8 e3 k0 o( G8 H* ?9 `3 }
            int nconv = reali + lenB;, z/ F1 C4 `9 }" D2 R. Q
            //#pragma omp parallel for# b/ [8 l6 d0 A; D4 M: e- z) O
            for (i = reali; i < nconv; i++)* U+ }8 ]4 W, I6 w) {+ |
            {) d& t1 h2 u6 c8 N
                    temp.re = 0;$ ~6 h8 m2 g* B1 s
                    temp.im = 0;0 ?5 v! D/ d$ Z8 {  G
                    i1 = i;
    % u$ b5 u6 O5 |: ], u: V                for (j = j0; j >= 0; j--)4 P1 I4 y4 m$ }- t6 Y6 V1 M  ^
                    {
    4 P5 v8 ]* s# P. X8 N$ k                        /* floating date operation */% L! s8 W+ @  a* D9 A; _
                    }

    : T0 y5 _1 [$ [1 }6 l8 E        }
      D0 Q7 t" w& u. C$ G+ i" v% Y6 p}4 t/ J/ e7 ?0 u* q9 U) x

    ; A' w, S( j1 N9 R; Cxcorr函数代码如上,comp是复数struct, 做过长度为11、19两个矢量的测试,和octave结果完全一样% P2 p4 d% {# K. l# |
    - m0 x, m% }2 c0 ^2 o; G* k
    红色部分是内循环,现在其内部操作都comment out 了, j0大概是 6000。
    , h. h0 S/ u  T2 I/ c现在call xcorr 100次,耗时78s.
    8 h- p3 Z# T0 N, ]7 V7 T$ [, N2 V9 t7 p# N; L, \) O0 ?9 o
    如果把红色部分内循环本身完全comment out, call xcorr 1000次,耗时 <1s.
    2 M! [! b% W2 z1 n8 ~5 b  K# V. l) L
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

    2025-9-22 22:19
  • 签到天数: 1183 天

    [LV.10]大乘

    6#
     楼主| 发表于 2022-9-25 00:17:17 | 只看该作者
    风雨无阻 发表于 2022-9-24 23:339 s* z+ ^, q: g! H
    Maybe Debug mode?
    8 A# b' P" ?4 J- @9 F6 ~" A

    ! I5 y% f6 d, E不应该,看我上面的回复。; E7 Z$ w5 w+ n$ E9 N6 z' p) r

    : p+ T. h# X  R! d我更怀疑是 VS 社区版的问题
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2026-2-7 02:13
  • 签到天数: 1955 天

    [LV.Master]无

    7#
    发表于 2022-9-25 00:20:10 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 00:24 编辑 7 Z- m$ e4 B6 A2 G! `
    雷达 发表于 2022-9-24 23:54
    ; _0 S' v& C; m1 j6 }$ K5 V* F- M; Avoid xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    ( H, h8 [+ ]: n# D1 Y. S{# P# h4 s- k7 a; O/ N1 Z; C. }
            comp temp, xtimesy;
    0 Y: E1 X+ m4 J

    ' e, i; h: X+ ?7 n+ e! c0 r: @  f这个不是这么比的吧。。。& d) H% W1 T; O0 z* P5 V4 [$ X

    . T% J3 e! e" U9 Q9 _( f, \; ~您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。, z: w+ J. q' g: ]+ f
    2 J: Z( q9 N$ O8 O. l  W/ X
    而加上内循环,光jmp和dec指令就至少多执行了6000个,慢个几十倍不是正常的么?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

    2025-9-22 22:19
  • 签到天数: 1183 天

    [LV.10]大乘

    8#
     楼主| 发表于 2022-9-25 00:46:56 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 01:09 编辑 - w2 a2 V; n  N! Q8 M9 S/ C. u. H- z
    数值分析 发表于 2022-9-25 00:20- e' w, F5 K2 t; o* D
    这个不是这么比的吧。。。
    1 a- W7 N) F  T5 G+ e6 }2 \1 e+ F6 D" U. B! n6 ^: |* L8 ]
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。

    0 b/ i( p$ k( R  m( `7 v: W9 ?" u0 ~! D# S+ q
    有道理。& b4 V4 k$ ~7 V
    所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,记得 numeric 库里有算向量内积的,我回头试试。) s6 y6 j7 A9 P- G: c

    . Y2 W+ W* ^, J( Z$ M' R我先尝试尽量用标准库,一个小程序,不想搞得太复杂。多谢了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    9#
    发表于 2022-9-25 01:27:53 | 只看该作者
    雷达 发表于 2022-9-25 00:46
    8 s/ d7 {' H/ H2 j$ G0 w有道理。
    ; M5 |+ p- [* n! q所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,这大 ...

    ( h- ?9 c5 U. p8 s& U, p# A! V' @你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子,把循环本身翻译成机器指令loop或dec/jnz,两者速度上会差很多" j. e' x- c( X, a+ Z1 {, M( l5 y  j
    Why is the loop instruction slow? Couldn't Intel have implemented it efficiently?
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    10#
    发表于 2022-9-25 01:48:51 | 只看该作者
    数值分析 发表于 2022-9-25 00:20; ^" M' H: @1 ?* q- r
    这个不是这么比的吧。。。- ?1 H* _: q! h4 c  H; J" ]

    9 U6 b  p- Q( m% Y1 f6 J您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    而加上内循环,光jmp和dec指令就至少多执行了6000个

    % Q5 r* p9 E0 N0 |6 {0 [2 k% a7 C* I! }- M0 Y1 J: C1 l2 |: f
    现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果循环这样跑,花不了多少时间。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2026-2-7 02:13
  • 签到天数: 1955 天

    [LV.Master]无

    11#
    发表于 2022-9-25 02:06:44 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 02:16 编辑 ( ~( \6 Q6 p) ]$ H& u4 }* o, G+ `
    沉宝 发表于 2022-9-25 01:48
    / I6 v4 b: C" I7 Z2 u+ }现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果 ...
    & M# P. m( Q/ ^& {9 T  _, H9 w

    : g, M5 N& c* g$ D8 w是的,兄台说的对。. X- N9 i& t! U$ Z, Z8 b( i

      s0 u' r  G1 ^8 Y# F其实我想说的是 真正数值计算部分和代码中其他不直接计算的overhead的比值这个事儿。$ W" x/ q  ]0 [& p% ?

    . l  E' e; \% q# l9 U* T7 K雷达兄构造测试用例的时候,屏蔽掉了所有计算的部分,使得剩下的都是overhead,这样run time比较的结果就显得好像不合理了。如果把计算加回去,计算部分的run time会dominate,结果就不那么离谱了。因为不好说,所以用指令数对比的方式试图直观地说明这一点。
    ! d: y$ q' [  `% w0 Z; f. D# o+ u
    比如说,如果有计算,那么跑六千个循环相对于计算应该用不了多少时间。但是如果一边是什么都不做,另一边是六千个循环,那六千个循环比什么都不做慢几十倍了,就不是那么不合理了。9 Z5 f; Z' \" D( n5 i

    : o$ a# G6 E3 a: I1 \当然也有可能像兄台说的,是优化参数的问题,但我觉得更多地是测试用例设计的不合理。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

    2025-9-22 22:19
  • 签到天数: 1183 天

    [LV.10]大乘

    12#
     楼主| 发表于 2022-9-25 04:47:43 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 04:49 编辑
    $ h, \! E, p, W0 U
    沉宝 发表于 2022-9-25 01:27$ W/ y2 M: b5 j# V% S5 V
    你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子 ...

    " r5 _' Y2 M4 W7 U/ r  u4 e9 U! y( x8 L3 y7 x
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差一倍,我上面这个差的太多了。4 K& M3 _: G8 h+ f
    % M7 v7 z* A. R
    我已经完全懵了。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    13#
    发表于 2022-9-25 05:51:23 | 只看该作者
    雷达 发表于 2022-9-25 04:47
    ' h& e/ A. I3 n又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...
    2 i  x% v# z4 V$ M
    时间差一倍的结果可以接受。; {+ k# k9 |6 L, H# ^, ]

    * s* c0 S' J& O2 ]( F2 x你还是用profile工具看看吧。现在大家都主观瞎猜。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2026-2-7 02:13
  • 签到天数: 1955 天

    [LV.Master]无

    14#
    发表于 2022-9-25 14:58:59 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 15:38 编辑
    / g! e7 m4 F, x. }
    雷达 发表于 2022-9-25 04:47
    : G/ ^- \" N4 C! p" l又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...

    % u) ?# s5 o/ K# U0 F$ s. I; _$ l7 P( u! v8 B6 ]( U; e! }
    ( {. R) i+ Q; e7 A$ y
    & S7 G9 W$ \0 [8 \
    能不能把这个也贴上来,看看和上一个有什么不同?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

    2025-9-22 22:19
  • 签到天数: 1183 天

    [LV.10]大乘

    15#
     楼主| 发表于 2022-9-26 01:30:03 | 只看该作者
    本帖最后由 雷达 于 2022-9-27 01:17 编辑 " \* B  `/ E% ]/ d4 R' _1 D
    数值分析 发表于 2022-9-25 14:58
    5 i" B# D2 @$ H. M能不能把这个也贴上来,看看和上一个有什么不同?
    ( f5 b. i8 {8 o5 w  A% W; |1 K
    理了理思路,重新做了一个测试。
    4 `% U2 t1 b" J  h% m做了两个 vector 和 两个 float *, 都长 100000
    ; ~* Y$ P' P. |5 U  x" i1 M" w2 f外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
    4 t; T3 s% `, c( V) |' |) C. r
    7 G: U4 l! @2 K. n内循环试了4种方法,1 R+ i- C; V: N" T9 e' `# M
    1. 直接调用 vector inner_product 247s - B/ H' ~" E% z# c$ u! _
    2. vector 循环点乘累加 237s
    : J% \' X' W7 N! G* D3. float * 循环点乘累加 204s
    / |5 ?: \+ v* d4. 空循环 100000 次 202s
    / p  n3 j# X' M+ d% F1 k, {2 b2 n, `' I- `7 m7 A' R
    不做内循环 200s% f4 w) u4 e+ |. j4 [' P* d

    : N' X! n& i" ^2 Y( M* l) `你昨天说的对,内循环本身占比是很小的,大头在其他处理。
    ) B2 L% `/ u5 e$ L! L另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。3 I" N3 K& l8 p
    & d& V2 Y& l6 o* l! d" k7 y
    至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试). B& V7 L: {) W
    + ?0 w' l) s& Z: g1 g% u
    (为什么下面我贴的  b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成  jj 好了,原来 方括号里的 i 是斜体标志  LOL)% P" B; A; Y1 o" j, v( `
    , x9 M0 w, q  k8 z# @
            std::vector < float > vec1(N);$ N$ k1 \, _, E' |& h& ^' `3 t) }
            std::vector < float > vec2(N);
    * X3 @! D0 l( U, Z+ d        float* b1 = new float[N];0 H! d& o7 D: m! o- q6 ^
            float* b2 = new float[N];4 y( x' Q+ g( _
    1 [7 s6 S1 w1 I4 L; x
            for (int j = 0; j < 6000; j++): t' ]. _0 t  @; t1 o  N  [
            {5 X6 {: i+ P" V, G9 L; _8 c  E
                    std::generate(vec1.begin(), vec1.end(), []() {5 x  g8 u9 b9 W4 O% \. Y
                            return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
    " \# {) Y5 X  A: s) G( U                        });
    ) j& w* \; u+ P# F" ^6 u% o/ S% m' U0 P6 z$ [& _
                    std::generate(vec2.begin(), vec2.end(), []() {: j' K5 f( D3 Y0 A  ]& `
                            return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;/ r! R) e6 y8 U- y2 F7 @! d1 ^
                            });
    ' h* G7 i& _) k; s" t
    7 W: e) h4 j/ d- s3 Z$ P% i' Q6 j                for (size_t jj = 0; jj < vec1.size(); jj++)
    ) A6 x3 i8 Y/ r  u                {" e2 F; [/ j7 V5 |) S
                            b1[jj] = vec1[jj];3 P4 r) t* B' l* G% D
                    }  d8 q  [) N5 p; L# R

    2 P3 K! Z0 [  A* b5 P0 c4 ~                for (size_t jj = 0; jj < vec2.size(); jj++)
    6 H3 W  i% q6 [' N1 @                {/ x5 z, `- E& w, y/ E0 @4 A1 z  K
                            b2[jj] = vec2[jj];
    , I3 z" {- z$ Y; f0 S( w6 {* o* i                }
    % `' @) ~9 C% q& T, _/ x# F" D: w2 G" C8 Q
                    //Method - 1  N=100000 247s    u  J4 G+ P  }0 @3 t0 e
                    //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);5 H+ W, G5 f2 Q( p
                                    
    $ C9 {4 W$ @+ L                //Method - 2  N=100000  237s
    $ Z) r! t# y8 X' y                /*
    / w- k0 P  k4 R2 C9 @# X' p  w/ t                for (int jj = 0; jj < N ; jj++)! T+ j6 U  S0 V) O/ O& p
                    {
    - F- m  Q. ]+ [                        fresult += vec1[jj] * vec2[jj];
    / T( }( e: u+ V& C0 |0 n5 U                }) J4 C3 K% ?# c' c& O. p
                    */7 d" ?* E+ _8 d
                                    7 W% p4 R, B7 E# f1 |% H
                    //Method - 3  N=100000 204s. x- |: ~7 N; H& I# H
                    /*# ]( f4 S4 @4 W7 j- ^
                    for (int jj = 0; jj < N; jj++)
    ( w. o. X' h8 C                {
    * F7 v, u- |  l& P- T% h8 `( t  F                        fresult += b1[jj] * b2[jj];
    : s" j9 [- d% o6 R' L                }
    * j0 |4 ]$ K, ?1 ]) Y8 ?                */
    - {. |* x" `( G5 e7 O
    ' P; b9 t+ w) F6 m$ L3 b* k                //Method - 4   202s
    7 m  k' Q9 W2 ~                /*
    # d* H  d& |+ {0 @                for (int jj = 0; jj < N; jj++)
    . R7 i4 ^* @3 H$ @6 x/ L% M                {
    8 p5 v7 _: S: o4 `                        6 d$ q# {2 \/ E3 R, k4 m' _. K4 i
                    }0 E; X! ^5 v# l* j+ J, @* o
                    */
    9 y& k. b6 c  C& E; a- s, x9 T, D                //comment out all methods, N=100000  202s               
    ; s* @' B& S1 ]# O- Q/ p        }$ ^* B6 ?/ O8 |
    & {& D: D9 `% Y% D8 M
            delete []b1;
    / k5 g) |9 z: j& i$ @* G+ F7 K        delete []b2;

    # j% {' B5 ^* X. q( h
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2020-2-8 10:08
  • 签到天数: 2 天

    [LV.1]炼气

    16#
    发表于 2022-9-27 00:15:38 | 只看该作者
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?
    ; z9 T% S& ?" ~
    1 i4 \( r9 N9 q; z  \8 w6 R你第二个试验里面的j在循环里面又重新定义了啊,你确定真的跑了6000次?
    * B( S; }0 L( W
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

    2025-9-22 22:19
  • 签到天数: 1183 天

    [LV.10]大乘

    17#
     楼主| 发表于 2022-9-27 01:16:03 | 只看该作者
    机器猫 发表于 2022-9-27 00:15
    ! W' h$ R" f  o$ ~  d瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?: _; r6 v( V/ o2 a5 K2 d

    / C4 E2 F5 u1 g" |: y# u# B你第二个试验里面的j在循环里面又重新定义 ...
    / O$ n4 S  I2 Z; d5 o  g+ h
    内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL! ~0 x! [+ l5 V( R* |7 ?0 M9 E
    $ K7 r/ j: S: r$ c
    不和它较劲了,瞎耽误工夫,我已经转到 ubuntu, 也准备顺便试试 avx2 向量化。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2020-2-8 10:08
  • 签到天数: 2 天

    [LV.1]炼气

    18#
    发表于 2022-9-27 02:06:58 | 只看该作者
    雷达 发表于 2022-9-27 01:16: Y! O# P# {& t
    内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL5 G4 s! t; S* y# V
    5 p: K' C4 B' L  I( ~. A+ s9 m* Q( j
    不和它 ...
    * S6 q. w# H; l0 u7 \
    / [  i/ Y) E8 [0 ?
    不过可以试试我说的register变量。前一个试验j是混在一堆其它变量里一起定义的,很有可能是在stack上,这样内存读写会更多,要是再碰上每次都需要加载cache就更慢了。9 `/ R6 Z  @. d8 d0 k1 s  D
    后面一个是在循环那里定义的,说不定编译器就把它优化成register变量了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    19#
    发表于 2022-9-27 07:25:57 | 只看该作者
    一个无关问题,为什么爱坛的帖子里在我这里有好些奇怪的东东在里面,是防拷贝措施吗?
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    20#
    发表于 2022-9-27 20:29:50 | 只看该作者
    雷达 发表于 2022-9-24 23:54
    0 z' x0 [+ {- p9 n7 T4 j- c1 f0 S0 c4 ovoid xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    & V$ w0 f* p) j{
    , G1 C3 r) T  M: _        comp temp, xtimesy;
    5 I1 h5 i& z3 V; T
    这个code里面如果Openmp没有被注释掉的话,那么temp那个变量应该是定义在循环里面,否则线程之间会存在争夺写入那个temp的风险。/ A1 \2 I# W$ \4 Z. i9 C
    内层for循环如果没有内部操作的话,编译时应该被优化掉了,和你完全注册掉整个循环是一回事。可能你的编译设置没有打开优化?
    8 [3 o" G, Q- L9 M! H# _VS社区版没有问题,我工作用的就是社区版,设置正常的话不会比商业版差。以前游说头头用Intel Compiler,他说不想花钱,而且差不了多少,就一直用到现在。
    回复 支持 反对

    使用道具 举报

    手机版|小黑屋|Archiver|网站错误报告|爱吱声   

    GMT+8, 2026-7-1 15:52 , Processed in 0.139667 second(s), 19 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

    快速回复 返回顶部 返回列表