设为首页收藏本站

爱吱声

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

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2022-9-24 22:54:26 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
    C++ 比 Octave 慢好多,怎么破?4 g% V# y" O  }; r* I$ y% R& W/ w8 E
    . r& z. ~0 x, E" z* u
    自相关两层循环,内层循环涉及浮点数计算,试验了一下把内层循环内部全都 comment out 只留个壳子,  但空的内层循环本身就把速度拉下来了,看来问题并不在浮点计算。
    , X' C. E# E0 ^) G
    % s- H; A  j, V7 o* G速度优化问题真的很有意思啊。1 n3 m* |. ~; Q& w5 @
    ) _0 P4 m# F0 u4 Q- u2 ^! R2 S7 Y' V
    欢迎大家继续讨论

    评分

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

    查看全部评分

  • TA的每日心情
    开心
    昨天 18:39
  • 签到天数: 1949 天

    [LV.Master]无

    沙发
    发表于 2022-9-24 23:04:16 | 只看该作者
    拉下来?拉多少?
    . j# A' ^! n+ m把代码贴上来看看?
    1 E5 K9 q, u$ u, c+ d8 U1 {" X$ q
    难道分支预测不准破坏流水线执行?不该啊。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

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

    使用道具 举报

  • TA的每日心情
    开心
    2025-6-14 10:13
  • 签到天数: 124 天

    [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 编辑 / b3 r& X- P7 n9 V
    数值分析 发表于 2022-9-24 23:04+ J3 r# E$ f; h/ u. f
    拉下来?拉多少?
    - l5 _. f3 u+ n# e0 i8 z( W# W3 V8 D把代码贴上来看看?

    5 f5 s( I, T& x" t& f! }7 f2 K, |: e# K1 t$ s% M, C, }
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)6 B8 c- L2 q: V2 o1 F1 F0 ?
    {
    # I8 h8 d' t( N* L* V        comp temp, xtimesy;6 C. B8 y: X' g& [- x5 E6 j
            xtimesy.re = 0;
    : q4 q3 k3 y$ ]0 Z3 H        xtimesy.im = 0;$ g3 \# R4 V! H: g3 r( D
            int j0 = lenB - 1;
    : k8 {. `6 f8 Q  ^        int    i, j, i1, reali;
    " f( T$ t' E  S% P, G; t        if (lenA % 2 == 1)
    0 x2 I1 G! n8 X. K& N                reali = lenA + 1;" A. g- ~4 \" S- c" u; }8 q0 n) I
            else
    * P0 v# R5 |( f  D                reali = lenA;9 N8 \: g& R4 y. F2 A/ ?
            reali /= 2;
    " q7 }9 n+ I) e8 Y: A; t) h* y: @& a2 S/ \3 [& T
            int nconv = reali + lenB;
    : z! L' b, k* h" m- E        //#pragma omp parallel for% k+ O$ Y# \( G: ^- C
            for (i = reali; i < nconv; i++)
    $ o) b9 l& V8 o& K        {. M7 U4 e0 N: A# J5 p  B
                    temp.re = 0;
    * X+ x! B1 w$ [0 g. y; \                temp.im = 0;
    " _+ q' o5 A; w7 h- D                i1 = i;
    ; f: k( c8 r: s* k' d                for (j = j0; j >= 0; j--)" `$ i" i1 F1 A& X$ }' x
                    {
    . X8 G* r; Q9 @                        /* floating date operation */: ~" o6 R0 h5 L$ \, ~+ W
                    }

    . l8 M. Z. p$ w1 k* ?; _+ R        }
    4 o* x( }6 E' w/ G( E+ |, Z/ u( M}+ p, N" O4 ~8 q; |7 L. G

    " h, Q% S: K$ T( t" X5 v, ?xcorr函数代码如上,comp是复数struct, 做过长度为11、19两个矢量的测试,和octave结果完全一样: y+ |- n8 N1 P& U5 z" ?: B

    4 y' |. g. @; ^红色部分是内循环,现在其内部操作都comment out 了, j0大概是 6000。
    ' ?6 W2 V2 ?$ t6 ?  q; i, M现在call xcorr 100次,耗时78s.7 o4 r7 T" m% c  Q

    - t" E  R5 Y" u! N! X如果把红色部分内循环本身完全comment out, call xcorr 1000次,耗时 <1s. ' ~, ~3 U. H" y& ~9 M

    - M, _7 _$ t: J, [2 c  Q  }& o3 ^  Z
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    6#
     楼主| 发表于 2022-9-25 00:17:17 | 只看该作者
    风雨无阻 发表于 2022-9-24 23:33$ `) m: V! R9 }" {
    Maybe Debug mode?
    * G8 h: S2 {6 ^

    1 }9 X. a: n3 V' N不应该,看我上面的回复。9 w/ @4 F1 j  C* o0 T1 |
    6 q) s0 r0 L# y$ g
    我更怀疑是 VS 社区版的问题
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    昨天 18:39
  • 签到天数: 1949 天

    [LV.Master]无

    7#
    发表于 2022-9-25 00:20:10 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 00:24 编辑
    * B3 M1 x3 K/ X6 ]6 F4 ~  A
    雷达 发表于 2022-9-24 23:54
    . ?$ F2 c- ^; T$ Tvoid xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    5 a6 _: Z# K' z6 }1 r{5 X1 q: p4 `$ x5 R
            comp temp, xtimesy;

    ; c) W5 q) q2 v# h- O; [% Q0 y: k9 s& c) A- \
    这个不是这么比的吧。。。: L8 U% `6 H7 u& Q# i  t
    3 Q: a9 W; w$ r/ n# a
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。$ _; \( a: [* |' t$ y  H8 S
    5 Y  O5 r- E7 k+ S' ?* j, 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 编辑
    3 i% W4 c, ?" _/ z2 i
    数值分析 发表于 2022-9-25 00:20
    * n* R, P$ f: R这个不是这么比的吧。。。9 D% u2 |& {/ j: Y: p& r" a
    8 G  x' N5 A$ `4 o9 X
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。

      d: [8 }' \# C2 H
    : q; R  u! }9 \/ S/ ~8 h1 B有道理。
    1 g. @0 e8 I8 M, U" S7 z所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,记得 numeric 库里有算向量内积的,我回头试试。
    1 M  {7 E8 t: i/ f; S+ ]  _, R4 e9 u5 _6 j! }/ q8 @# h, D: C
    我先尝试尽量用标准库,一个小程序,不想搞得太复杂。多谢了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    9#
    发表于 2022-9-25 01:27:53 | 只看该作者
    雷达 发表于 2022-9-25 00:463 B" i7 a& v0 H( z8 v
    有道理。. l1 A8 x0 r0 O9 {! D, V6 R
    所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,这大 ...

    ) ^/ e  h* w' R$ V" G你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子,把循环本身翻译成机器指令loop或dec/jnz,两者速度上会差很多
    5 e) b8 b& q5 ~6 v- D, ~5 G% o& QWhy is the loop instruction slow? Couldn't Intel have implemented it efficiently?
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    10#
    发表于 2022-9-25 01:48:51 | 只看该作者
    数值分析 发表于 2022-9-25 00:20
      l; p! f8 t5 ?- q* ?) o% V) G( u8 g这个不是这么比的吧。。。
    6 t# m& b3 \+ p$ Q- V/ {: v# o3 N7 X) B; Y
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    而加上内循环,光jmp和dec指令就至少多执行了6000个
    4 v3 \* v) ?+ r% I4 x5 G6 d

    $ c, N. V) k/ B, u' v5 G现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果循环这样跑,花不了多少时间。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    昨天 18:39
  • 签到天数: 1949 天

    [LV.Master]无

    11#
    发表于 2022-9-25 02:06:44 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 02:16 编辑 & S" G; z3 }4 t6 k9 D, j2 N/ G
    沉宝 发表于 2022-9-25 01:48
    % e# e8 W5 j( _) t& V  o  g现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果 ...

    4 z& |4 N9 @# G
    , z+ _9 [. K5 e是的,兄台说的对。
    / j! e* L1 A! i! ]2 Y  {4 m" ?( v! T! J0 L: N; P
    其实我想说的是 真正数值计算部分和代码中其他不直接计算的overhead的比值这个事儿。! X/ \+ ~( u2 E( O, O3 S
    / Z: c) p6 f, [; N4 }* U
    雷达兄构造测试用例的时候,屏蔽掉了所有计算的部分,使得剩下的都是overhead,这样run time比较的结果就显得好像不合理了。如果把计算加回去,计算部分的run time会dominate,结果就不那么离谱了。因为不好说,所以用指令数对比的方式试图直观地说明这一点。
    1 w- i9 e* I7 q# p! N, [$ D6 h" P; e! k/ ^3 `( t1 w! b% S2 Q
    比如说,如果有计算,那么跑六千个循环相对于计算应该用不了多少时间。但是如果一边是什么都不做,另一边是六千个循环,那六千个循环比什么都不做慢几十倍了,就不是那么不合理了。  y6 N3 U- O9 M! L- a8 s' j  K

    & N5 G2 v  u" }0 f+ c1 q' [当然也有可能像兄台说的,是优化参数的问题,但我觉得更多地是测试用例设计的不合理。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    12#
     楼主| 发表于 2022-9-25 04:47:43 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 04:49 编辑 ) e8 x% ^5 ^' b  `0 [; w% L& \7 ^' X
    沉宝 发表于 2022-9-25 01:27
      `0 g" e$ D9 A2 f0 ^  u) s* d7 F你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子 ...
    ( G1 o7 _& |+ {( D; F$ s
    0 g5 X4 ~: e! V, n! F
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差一倍,我上面这个差的太多了。1 Y7 K+ {8 I9 u" x
    8 Z+ N0 l' I4 R  ^% |
    我已经完全懵了。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    13#
    发表于 2022-9-25 05:51:23 | 只看该作者
    雷达 发表于 2022-9-25 04:47& n. ^& E$ e7 q  |8 B
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...
    2 N' z# D% K- O+ _8 @
    时间差一倍的结果可以接受。
    " |: C! N! G- F" c" t) @. j# Y3 T
    你还是用profile工具看看吧。现在大家都主观瞎猜。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    昨天 18:39
  • 签到天数: 1949 天

    [LV.Master]无

    14#
    发表于 2022-9-25 14:58:59 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 15:38 编辑 9 X) m0 t4 j! S% r% i# I& ~8 F3 q
    雷达 发表于 2022-9-25 04:472 ]! X  [9 D3 i
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...

    2 K/ p0 ?- G! S! K3 Y. v5 l2 G5 t" D  I. @7 |) ]2 k6 \( K
    3 H5 S2 d( Y2 t  L: N. u

      z5 j* t% R; V3 x能不能把这个也贴上来,看看和上一个有什么不同?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    15#
     楼主| 发表于 2022-9-26 01:30:03 | 只看该作者
    本帖最后由 雷达 于 2022-9-27 01:17 编辑
    5 b( b; g6 s+ ^: ?  k
    数值分析 发表于 2022-9-25 14:58; a, _& F) L; ~
    能不能把这个也贴上来,看看和上一个有什么不同?

    . O$ s% ]+ z- T7 ~0 j理了理思路,重新做了一个测试。4 W. \$ ?# @0 J2 ~
    做了两个 vector 和 两个 float *, 都长 100000- K1 I! v) f  M/ t4 Q
    外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
    % m* q6 F; O4 J( ^2 H- m/ \
    0 I6 s- m8 X% R7 O4 @* O0 Q内循环试了4种方法,9 l( W  ]; d0 a: ?
    1. 直接调用 vector inner_product 247s
    3 X) f  D7 `2 z% B3 G/ y9 v6 s2. vector 循环点乘累加 237s
    - g5 o8 J1 ^0 C( D) Q& I, ]5 W3. float * 循环点乘累加 204s8 o8 G1 y. B6 D/ I
    4. 空循环 100000 次 202s
    0 e* P2 _" p) d" b! D4 f& Z2 ]
    5 z( }$ j. w, o! E. k* w# z不做内循环 200s$ v9 Q. Y/ H1 x7 m0 `9 m$ c

    ) C! E. I; q; y4 z. r你昨天说的对,内循环本身占比是很小的,大头在其他处理。' Q. t% w4 J, W# w2 U5 ?% C
    另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
    ; e5 _# `- g; |6 _! X
    7 b' T0 |. \$ d1 D  }至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)2 M2 H0 I% X7 l# ~4 H

    ( o% q! @# }' m# z* D$ p% b' K(为什么下面我贴的  b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成  jj 好了,原来 方括号里的 i 是斜体标志  LOL)
    4 `6 M5 \& ~9 u& _2 Y% D+ j% O; a  F8 F4 u& L& m% D1 {' n% G
            std::vector < float > vec1(N);
    7 j+ ^7 B+ i& T, |        std::vector < float > vec2(N);( V' }3 v, C: T
            float* b1 = new float[N];+ b. a, d$ z3 E- M# d) a
            float* b2 = new float[N];; U- M2 G. D1 }! l, H8 A( F

    ' E! T+ b! G+ s. L/ C' }1 g- F, V        for (int j = 0; j < 6000; j++)! [( \. \( x$ G0 ~; u0 f* G2 D
            {
    & S* [# ?) s1 y* G0 K: h1 f) i                std::generate(vec1.begin(), vec1.end(), []() {- e: a# r7 f% v/ o# f+ P# I* x
                            return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;, s1 [# q8 z4 }9 i; e, b
                            });
    ) n/ G/ q  A6 I7 R- E" r. u
    ( D5 c, `( b, z                std::generate(vec2.begin(), vec2.end(), []() {
    : G$ G& u" n* x4 B; _3 b                        return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
    4 w; N! S( D  ~                        });
    3 `6 @7 r* b$ ~. ~; o& [8 e+ o# u1 r9 X$ W& W
                    for (size_t jj = 0; jj < vec1.size(); jj++)$ l6 m* z8 y: u2 B
                    {
    ! Q/ F$ b6 a3 m: x% U0 m0 I6 i                        b1[jj] = vec1[jj];5 X* s) _. J. r0 y
                    }2 v% U# W# h/ v6 A3 w% r, v
    ; b, M+ H# k: d! U' n9 L# W
                    for (size_t jj = 0; jj < vec2.size(); jj++)9 A* ]. o5 {- D* U. ^
                    {6 O4 s9 I4 Y6 i5 B
                            b2[jj] = vec2[jj];
    9 A4 w! ?" v( E" F) ^3 y                }
    * S4 d# T: D6 @6 z' c. v0 t& e3 _& k# [! Q
                    //Method - 1  N=100000 247s  
    $ O& c' f. c; Z# [                //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
    7 g6 \* L- X6 h3 V( F8 F- _                                ) r( j) `) Z! ^# B
                    //Method - 2  N=100000  237s2 L1 \. A7 ?. q* r/ G
                    /*
    8 i: @! B% Q/ Q! A+ k                for (int jj = 0; jj < N ; jj++)* |" ]1 d7 [6 T, o' C5 X
                    {
    " v  X3 g  ]8 `& W                        fresult += vec1[jj] * vec2[jj];( y$ [8 k8 }3 |4 S
                    }
    8 {- q2 N! c% I( N- c% S                */
    * v1 t2 a- G3 a( K* b; `                                ; T& i( l) }* P! F' [& N
                    //Method - 3  N=100000 204s5 r- n0 P- D" Q+ l5 E! ?$ g
                    /*
    % M3 I( L/ s# A                for (int jj = 0; jj < N; jj++)- u. H8 T/ V2 y8 l# h2 C
                    {
    ; l  [& [  _& i! B% X                        fresult += b1[jj] * b2[jj];
    5 }; a, Y9 s5 h; q1 r8 {2 ~% p! _7 ?                }
    3 @5 X1 ?( j5 e) W                */
    9 K' d: U) ^& J8 w9 m0 v# r, @' W2 I# E) f  ^# w
                    //Method - 4   202s
    ' P6 {0 c& o- a6 s9 D; J                /*
    9 E- Q* `: H- o& k7 K                for (int jj = 0; jj < N; jj++)' c( q0 o1 z- o! @, \" n
                    {
    ( _4 P/ }( I8 H; x                        
    $ O2 Z# u0 s/ ~2 H0 `2 M                }4 G) G' j; X0 I) V( t( B
                    */4 w  c2 K  j% Y9 {6 G
                    //comment out all methods, N=100000  202s               
    + F+ ~+ n3 x9 S3 C/ U7 j        }8 M! A: I, V6 K/ A
    . Y" V& F6 O+ _' b- b
            delete []b1;
    3 T2 m8 \& ~8 Y  _. T        delete []b2;
    8 I3 {3 C% T8 |8 d
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    16#
    发表于 2022-9-27 00:15:38 | 只看该作者
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?+ X4 ?5 i/ I. s: u$ o
    ' z* {0 r, U9 j8 [" u
    你第二个试验里面的j在循环里面又重新定义了啊,你确定真的跑了6000次?  L5 Y! \2 D- C
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    17#
     楼主| 发表于 2022-9-27 01:16:03 | 只看该作者
    机器猫 发表于 2022-9-27 00:15; H4 N9 g0 `0 R# N; y
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?0 |+ |9 b. T; F9 j( P9 ~
    # t* G& j4 ^0 l
    你第二个试验里面的j在循环里面又重新定义 ...

    ' ]& m8 {# n: Y6 ]1 m- C内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL9 j" u0 b. ^4 x3 k9 k2 V
    9 l6 I; p% m' Z: y
    不和它较劲了,瞎耽误工夫,我已经转到 ubuntu, 也准备顺便试试 avx2 向量化。
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    18#
    发表于 2022-9-27 02:06:58 | 只看该作者
    雷达 发表于 2022-9-27 01:16
    : g* ^/ P9 Y% k+ Q7 g内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL
    ) m/ s$ b$ I5 k; ^: ]
    - ~0 }4 H* ~6 E' }0 K不和它 ...

    * ~; ~' {1 C) o* N
    4 D6 X% J8 ^, B1 R; E% W1 P* ]不过可以试试我说的register变量。前一个试验j是混在一堆其它变量里一起定义的,很有可能是在stack上,这样内存读写会更多,要是再碰上每次都需要加载cache就更慢了。
    9 ^5 w3 X$ F2 N9 }# i* y( n后面一个是在循环那里定义的,说不定编译器就把它优化成register变量了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

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

    使用道具 举报

    该用户从未签到

    20#
    发表于 2022-9-27 20:29:50 | 只看该作者
    雷达 发表于 2022-9-24 23:54% u# Y, K7 ?! c3 A% o3 y: L2 t
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    ) A/ x* A) U( J- A! a. R{3 o* k; M5 L. t- \: v% T# R
            comp temp, xtimesy;
    3 R5 ^$ t% r2 g8 Z/ q. Y& K
    这个code里面如果Openmp没有被注释掉的话,那么temp那个变量应该是定义在循环里面,否则线程之间会存在争夺写入那个temp的风险。/ n0 x$ r: \; u, s, r
    内层for循环如果没有内部操作的话,编译时应该被优化掉了,和你完全注册掉整个循环是一回事。可能你的编译设置没有打开优化?
    6 W* P) B1 n/ }- ~" z. [VS社区版没有问题,我工作用的就是社区版,设置正常的话不会比商业版差。以前游说头头用Intel Compiler,他说不想花钱,而且差不了多少,就一直用到现在。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2025-10-17 13:55 , Processed in 0.038735 second(s), 19 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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