设为首页收藏本站

爱吱声

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

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2022-9-24 22:54:26 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
    C++ 比 Octave 慢好多,怎么破?
    * l7 l( p# @( K9 s6 s% y0 e
    / w: ^9 u0 z4 x5 ]& o" X自相关两层循环,内层循环涉及浮点数计算,试验了一下把内层循环内部全都 comment out 只留个壳子,  但空的内层循环本身就把速度拉下来了,看来问题并不在浮点计算。$ o3 J5 g- h, g
    ; @% L) F8 D6 R5 J# P
    速度优化问题真的很有意思啊。0 O( [* S$ d  T3 }

    ' B/ H7 r2 a, U4 |欢迎大家继续讨论

    评分

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

    查看全部评分

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

    [LV.Master]无

    沙发
    发表于 2022-9-24 23:04:16 | 只看该作者
    拉下来?拉多少?3 K  w* K& B7 ~" x, {
    把代码贴上来看看?
    # y, _* L$ `( j$ e+ v; n9 F) W
    难道分支预测不准破坏流水线执行?不该啊。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    板凳
    发表于 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 编辑
    & J) Y5 G! Y6 C. b: v- S
    数值分析 发表于 2022-9-24 23:04$ ]  e. J/ `. Q' p6 n
    拉下来?拉多少?
    ; n7 a5 L) _: i# D" q9 [3 f把代码贴上来看看?

    ' Q1 |6 k; G; h2 S% w/ o8 F! ^. ]2 ?; y; v4 r
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    % M6 i8 ~! `+ B2 @{9 |/ J8 c! f/ m+ t4 l+ [1 V) n
            comp temp, xtimesy;
    0 m2 E2 T) d8 h5 |2 @2 L) r7 G        xtimesy.re = 0;' P- N- S. `' M$ q- J2 L- I
            xtimesy.im = 0;/ y' g5 C/ e4 P5 H
            int j0 = lenB - 1;6 h" b/ T: \5 X
            int    i, j, i1, reali;6 r2 l4 R+ p0 {& q4 D9 ^& A
            if (lenA % 2 == 1)) }' n7 `7 Q. k+ U( r& [* ]
                    reali = lenA + 1;2 B1 e4 T+ m/ ~$ r0 t+ o: x3 @
            else
      L9 b2 b2 I4 q: A5 q                reali = lenA;
    8 ^; J. H$ D0 _$ e3 w# }$ p        reali /= 2;( a& ~2 X4 a' F. y# f
    8 b& O  T: h* o( N* T. {3 w/ u
            int nconv = reali + lenB;
    $ B& n) a2 J1 I: Y        //#pragma omp parallel for+ U, j. O2 m( m$ n: v
            for (i = reali; i < nconv; i++)% y& ]0 g  |) f% }+ q- o
            {! ]) y9 `0 P: b3 S
                    temp.re = 0;5 M& p- e1 e# n6 y. O2 I
                    temp.im = 0;* h/ M+ b3 o: D2 A& Z+ |: ]1 i
                    i1 = i;
    ! A, S0 H2 E, z3 T& x& [( J( p/ ^! d                for (j = j0; j >= 0; j--)
    ( ^- V6 O/ F: s' t1 u6 k; C                {
    ! y3 w; P7 V! o" i; M, E5 h                        /* floating date operation */
    0 x1 l3 s- u, q0 Q7 |: O( t7 }                }
    5 {% G- O4 n$ }# y" a
            }
    5 R' V' `+ Y1 }* B6 u" o/ s8 [}
    ' a% |  A( d. p* P1 O
    , l5 z; R9 [; Vxcorr函数代码如上,comp是复数struct, 做过长度为11、19两个矢量的测试,和octave结果完全一样
    5 _% o7 u9 {2 o) u& N0 b) q0 |& I% V7 Y; n# b
    红色部分是内循环,现在其内部操作都comment out 了, j0大概是 6000。. j" z# I2 Z# a, A: g2 I$ |
    现在call xcorr 100次,耗时78s.- B4 n1 T3 B: X8 f9 ^9 r

    1 j+ n2 b: V6 }6 h如果把红色部分内循环本身完全comment out, call xcorr 1000次,耗时 <1s. 0 S. H1 ~/ B' i: @1 n: N/ M
    $ n4 Z  z- [; j
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    6#
     楼主| 发表于 2022-9-25 00:17:17 | 只看该作者
    风雨无阻 发表于 2022-9-24 23:33
    + o! x' `, o" J5 r, X) O! rMaybe Debug mode?

    & D" U. S) l& q, d
    0 |% y4 }+ v3 A; t- m# M不应该,看我上面的回复。' [3 [5 |0 v% `, Q8 V, y/ o
    : G( Y( j+ m) v% r9 ?5 R$ m
    我更怀疑是 VS 社区版的问题
    回复 支持 反对

    使用道具 举报

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

    [LV.Master]无

    7#
    发表于 2022-9-25 00:20:10 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 00:24 编辑 3 g. M* }. L# c* ~- `
    雷达 发表于 2022-9-24 23:549 i6 p  r: s7 n) K5 |& d" F6 g
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)" t& u' q5 j& z4 S/ i; V! d. G* I
    {- x9 u7 w8 z+ ]3 U! t3 V
            comp temp, xtimesy;
    * H# ]2 C+ ?: {9 B9 d
    3 q' L7 _5 `  K/ e- h. e) c/ S' }
    这个不是这么比的吧。。。  |6 j8 V, ]1 L4 f6 B. e- l9 h
    & s& M% Y' ?& Y/ c1 Y
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。. H  {3 Y. [# s7 w

    # C( t2 c4 v0 l而加上内循环,光jmp和dec指令就至少多执行了6000个,慢个几十倍不是正常的么?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    8#
     楼主| 发表于 2022-9-25 00:46:56 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 01:09 编辑 # T) `" a8 {" Q+ l
    数值分析 发表于 2022-9-25 00:20- S- H* k( F. C4 `+ P) n
    这个不是这么比的吧。。。
    6 N* R* g/ Y3 ]8 S
    9 v* S( P. ?/ s1 E2 m* [" g您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。

    * W7 \5 G* i6 H) S
    + c+ N4 [" S) _$ ~, y( w. R& S有道理。
    ! _. i" q9 n" X# g所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,记得 numeric 库里有算向量内积的,我回头试试。
    6 h4 Q& ?. s, g4 u+ p6 B2 _/ P5 U! s$ Y2 X0 X
    我先尝试尽量用标准库,一个小程序,不想搞得太复杂。多谢了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    9#
    发表于 2022-9-25 01:27:53 | 只看该作者
    雷达 发表于 2022-9-25 00:46
    * T# k1 N6 l) c1 S  s; {有道理。# T1 ]" o& t3 S
    所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,这大 ...
    / a. c0 D4 R( G
    你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子,把循环本身翻译成机器指令loop或dec/jnz,两者速度上会差很多
    ! Z" Y% ~- R" f3 O3 F/ XWhy is the loop instruction slow? Couldn't Intel have implemented it efficiently?
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    10#
    发表于 2022-9-25 01:48:51 | 只看该作者
    数值分析 发表于 2022-9-25 00:20
    4 w" j4 n9 D5 U4 K! g( Q" }这个不是这么比的吧。。。
    , v* t' C2 n# a* t) B3 e5 ]( u. C8 c! v" K! r* q' |# c
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    而加上内循环,光jmp和dec指令就至少多执行了6000个

    , Z8 Z/ @* ^+ R6 m) \5 g+ _$ F' C1 O! y, z
    现在的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 编辑
    , n% O2 @, P: u; h( a
    沉宝 发表于 2022-9-25 01:485 X. s7 w- p) g: |9 E% x
    现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果 ...

    6 y; f( R: x0 J7 z4 M9 x$ b1 t0 l0 _
    是的,兄台说的对。0 e% _: e, o2 X

    ) ]5 e/ |" z8 S1 v4 u其实我想说的是 真正数值计算部分和代码中其他不直接计算的overhead的比值这个事儿。
    0 p# j! Z; n7 K$ k- z, y+ d  U/ u+ ?, y  X" s" Q- E
    雷达兄构造测试用例的时候,屏蔽掉了所有计算的部分,使得剩下的都是overhead,这样run time比较的结果就显得好像不合理了。如果把计算加回去,计算部分的run time会dominate,结果就不那么离谱了。因为不好说,所以用指令数对比的方式试图直观地说明这一点。$ g7 y/ [  m5 c$ s; ]: _1 `
    # [) x% t, ]' V) ]$ t3 ~3 I" W9 z
    比如说,如果有计算,那么跑六千个循环相对于计算应该用不了多少时间。但是如果一边是什么都不做,另一边是六千个循环,那六千个循环比什么都不做慢几十倍了,就不是那么不合理了。1 k/ B1 @2 F, A/ v( U& E
    ) Y. ]% ~, ~9 Y/ m9 O& R+ z
    当然也有可能像兄台说的,是优化参数的问题,但我觉得更多地是测试用例设计的不合理。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    12#
     楼主| 发表于 2022-9-25 04:47:43 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 04:49 编辑 ) h6 O% S- b0 K+ V6 j
    沉宝 发表于 2022-9-25 01:271 O& e4 T. G! D1 g  j- r' u3 Q
    你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子 ...
    0 ~! T* p- \3 R) q! W9 [/ V. n& m
    2 {' \$ ~3 c& _
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差一倍,我上面这个差的太多了。
    1 ]) j2 i3 \( m- i6 T' Q; _# t3 v6 d1 p1 |: O! w
    我已经完全懵了。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    13#
    发表于 2022-9-25 05:51:23 | 只看该作者
    雷达 发表于 2022-9-25 04:47
    . o4 v' b7 b: K1 m* c; e又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...
    " M  y' p1 {! q
    时间差一倍的结果可以接受。
    2 ~& T! ^; ?6 G- k; O6 r* ?1 J; Y% N. E/ l# W+ w
    你还是用profile工具看看吧。现在大家都主观瞎猜。
    回复 支持 反对

    使用道具 举报

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

    [LV.Master]无

    14#
    发表于 2022-9-25 14:58:59 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 15:38 编辑
    5 H! l7 `/ L& M7 @
    雷达 发表于 2022-9-25 04:47# }5 a2 F2 ?4 i, j% M
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...

    6 v8 D  g/ w' Z! K( G7 I% ~9 b" \) a) X& [$ `; }6 x7 [( H
    % C- O* R& h* D3 P+ W; s

    8 |; O" d9 T. O6 l, C2 ~, G能不能把这个也贴上来,看看和上一个有什么不同?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    15#
     楼主| 发表于 2022-9-26 01:30:03 | 只看该作者
    本帖最后由 雷达 于 2022-9-27 01:17 编辑
    / J8 f  \: w/ i
    数值分析 发表于 2022-9-25 14:58
    % h4 Y- `4 y3 _8 j5 ^能不能把这个也贴上来,看看和上一个有什么不同?

    ( y: [  W4 C* s! n理了理思路,重新做了一个测试。6 m; L3 c5 U8 ]5 [
    做了两个 vector 和 两个 float *, 都长 100000
    ) ?$ \& A5 A; r9 o; V外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
    0 v9 g, N) d* R! H
    1 O2 {. u2 g* T/ ^; l内循环试了4种方法,
    : B/ s7 H! H. u  S& Y8 `$ ]1. 直接调用 vector inner_product 247s
    , d8 Z, I  T8 S  g9 \2. vector 循环点乘累加 237s
    + q5 Z  @4 S5 p5 \0 Q3. float * 循环点乘累加 204s
    ) k, M( S0 g* M8 g7 ]" |8 j7 }6 @4. 空循环 100000 次 202s
    : f1 C. F" b+ K  T, `  x- y& E1 O0 F1 M1 M
    不做内循环 200s
    6 i" A8 F8 H3 Y6 p3 i! F
    : z. e' m! R# h$ s  A  }你昨天说的对,内循环本身占比是很小的,大头在其他处理。, ?- @! o) n* X
    另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。5 v% \3 r2 \$ f$ r) L( ~

    ) h& C, k9 B0 W6 q) q  [至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)1 c* _/ W& Y# N( B$ S$ C

    8 |, f! r. Q& i(为什么下面我贴的  b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成  jj 好了,原来 方括号里的 i 是斜体标志  LOL)
    * \. t0 `* c: K1 f: d1 f
    : m5 B# Z6 O+ o" T
            std::vector < float > vec1(N);
    ' o6 P; g0 l# r        std::vector < float > vec2(N);" f; D- p- U# m
            float* b1 = new float[N];
    1 C  V. h6 ~! T7 P' l+ Y        float* b2 = new float[N];* R. S; l# F5 |& T+ l2 N  A. @
    5 t+ d: F4 w' a' h7 U+ Z  n3 _7 _
            for (int j = 0; j < 6000; j++)
    ! a6 v5 l4 U$ P2 |        {. H+ ~6 H9 F: s5 A' L7 a. l8 {
                    std::generate(vec1.begin(), vec1.end(), []() {, T1 G7 O$ @! ?0 S) L- O& ]
                            return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;6 A. b  i6 W9 [8 |
                            });
    5 K5 h* S- b/ K3 U  }* p/ D0 X" _/ ^
                    std::generate(vec2.begin(), vec2.end(), []() {' I- J9 @& }6 {0 K: o
                            return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;  g( e1 u0 t( n; r+ r
                            });$ P! T- o0 O  t9 s+ }8 b

    . r% X- Y/ I- K9 x$ p1 ~! z                for (size_t jj = 0; jj < vec1.size(); jj++)
    . l. `# \0 n; L+ P: t, h8 k                {
    5 [, \7 s& K9 E- v  d2 E                        b1[jj] = vec1[jj];
    ) q0 i6 L# M" F6 g/ b                }
    * J# }1 o5 E0 K, t2 v9 l* D' e( v" [  V
    / r/ W  b& Q" f3 p; B3 ]6 A4 n                for (size_t jj = 0; jj < vec2.size(); jj++)
    $ N' g% n, C3 K9 T# G- u  u                {# e8 T/ \! v$ B1 |& J7 b6 c
                            b2[jj] = vec2[jj];
    3 X$ s. I) u% f8 v* b/ h                }
    " [, k" c/ E, x6 J& I* z% M
    7 B4 }- Y+ c$ m( s                //Method - 1  N=100000 247s  
    4 ^% B2 a8 B1 }. w* R6 N0 N9 y                //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
    9 M  @/ v- o& I5 P: s) w% N# G                                
    - \/ L# T. O2 ]; c9 e                //Method - 2  N=100000  237s- u( _2 j0 @+ Z+ Q/ Z5 r
                    /*9 E: m3 @( D' V$ Q3 m
                    for (int jj = 0; jj < N ; jj++)  ~: }" N" `. R. I
                    {2 ~5 E7 _3 S' u; i
                            fresult += vec1[jj] * vec2[jj];
    $ X' B# @. E5 R' u3 o$ r! }                }6 b& y3 W. }6 y4 [8 H
                    */% O, ^" c& v1 z& E
                                    
    ) i% L6 `" [* c" {% I: I7 G8 @7 C                //Method - 3  N=100000 204s
    ' c6 L  ~  s$ E% p' D: s                /*
    8 ~. w+ h# M8 e0 w* E* H' |                for (int jj = 0; jj < N; jj++)
      a. \/ O  q5 B. l# Q1 A$ A                {9 r  M9 F  ], H
                            fresult += b1[jj] * b2[jj];1 Y4 P' |1 t* {- I0 ?
                    }
    ( i. Y, o& `* \/ }                */
    8 p6 o7 `# N0 J6 ~  Y; M4 T2 X7 R) d  t3 V
                    //Method - 4   202s
    7 O, e- H$ [& `# p4 |6 Z' r9 I                /*
    7 }1 u$ `! b7 t! z                for (int jj = 0; jj < N; jj++)
    , E7 c3 L* w7 F; r# Z                {' t: W! f2 J7 ~4 {, ~4 {- V9 t- E: H
                            
    & ?, @/ O( b# K3 D, `. O. r* }                }. f( p1 Z- r  l+ B7 d; H
                    */
    * l4 g6 c: m5 Q4 q                //comment out all methods, N=100000  202s               
    % ?$ O  a( A- P+ s/ f6 |* A        }- V/ d5 `+ S: ?/ k  L
    $ V/ j# f6 D4 q' K7 g/ V
            delete []b1;
    9 u2 m% g' d* H/ C        delete []b2;

    $ u6 f! F! P; G- K
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    16#
    发表于 2022-9-27 00:15:38 | 只看该作者
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?' B1 Q. T6 }: k

    ; q4 e  q7 w5 z! a你第二个试验里面的j在循环里面又重新定义了啊,你确定真的跑了6000次?
    2 m3 H1 t! J! h+ z' E' j
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    17#
     楼主| 发表于 2022-9-27 01:16:03 | 只看该作者
    机器猫 发表于 2022-9-27 00:15! c3 U* n. ?' ^9 k4 x; b: S
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?! y: n- H! o% k

    4 p& U0 I! p0 h) Q  E/ }你第二个试验里面的j在循环里面又重新定义 ...
    7 d0 H* F% [3 Z$ W
    内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL) E$ @0 |- \: _; h2 c" j8 e
    " E1 X8 v) |* g9 k+ w4 H
    不和它较劲了,瞎耽误工夫,我已经转到 ubuntu, 也准备顺便试试 avx2 向量化。
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    18#
    发表于 2022-9-27 02:06:58 | 只看该作者
    雷达 发表于 2022-9-27 01:16; s" Z( Y- U7 v
    内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL
    ! I% n4 [+ \! r8 [& N: ^2 Y8 p7 L/ @5 z+ I  K3 G/ p/ E. \$ |' m+ a
    不和它 ...

    7 B' l- u& E! l3 s. A! Y
    ' q% o! u2 |, D' v6 z6 ?; g不过可以试试我说的register变量。前一个试验j是混在一堆其它变量里一起定义的,很有可能是在stack上,这样内存读写会更多,要是再碰上每次都需要加载cache就更慢了。
    7 r! C  f0 G* b. P) I$ b& D; }后面一个是在循环那里定义的,说不定编译器就把它优化成register变量了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

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

    使用道具 举报

    该用户从未签到

    20#
    发表于 2022-9-27 20:29:50 | 只看该作者
    雷达 发表于 2022-9-24 23:54; n. M" P* r( M& C+ G$ ^
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    , w; o3 x5 C- b1 S% ^# k{; M" W  x& \" D5 B  N: O) H
            comp temp, xtimesy;
    2 i5 U+ E9 j. V& j1 ^/ t. A
    这个code里面如果Openmp没有被注释掉的话,那么temp那个变量应该是定义在循环里面,否则线程之间会存在争夺写入那个temp的风险。/ M7 @. z8 }1 W  t- d' K8 l5 _
    内层for循环如果没有内部操作的话,编译时应该被优化掉了,和你完全注册掉整个循环是一回事。可能你的编译设置没有打开优化?
    : x$ I" s( f7 _+ V/ W8 J2 \3 FVS社区版没有问题,我工作用的就是社区版,设置正常的话不会比商业版差。以前游说头头用Intel Compiler,他说不想花钱,而且差不了多少,就一直用到现在。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2026-7-6 18:55 , Processed in 0.088495 second(s), 19 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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