设为首页收藏本站

爱吱声

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

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2022-9-24 22:54:26 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
    C++ 比 Octave 慢好多,怎么破?
    ) g7 n- z# B- G1 D* L/ q9 t6 F$ A7 o1 A- v) h# Z
    自相关两层循环,内层循环涉及浮点数计算,试验了一下把内层循环内部全都 comment out 只留个壳子,  但空的内层循环本身就把速度拉下来了,看来问题并不在浮点计算。  o- {, I0 q- i% a( V9 c
    3 b' a6 A7 W8 _7 u$ |  U
    速度优化问题真的很有意思啊。6 ~5 F! \' T' B, Y% y! h
    * v! o& e2 }0 s  r) e; @
    欢迎大家继续讨论

    评分

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

    查看全部评分

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

    [LV.Master]无

    沙发
    发表于 2022-9-24 23:04:16 | 只看该作者
    拉下来?拉多少?
    8 J7 ]( I3 ~- x把代码贴上来看看?$ W5 U; ~! ^' T, g# z

    2 R8 g1 x8 v" P. N( H! U9 M. w* k难道分支预测不准破坏流水线执行?不该啊。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    板凳
    发表于 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 编辑 . l) Y# r: b9 q2 k7 D; X" F7 T
    数值分析 发表于 2022-9-24 23:04
    4 N" q5 A6 _: Q2 t* a拉下来?拉多少?
    4 w8 Y+ v1 C! u% m( S- t4 B把代码贴上来看看?

    ; D+ R7 l. R% O& V
    " q& x. ~) E- e; C4 zvoid xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    " J* {+ S8 o+ ^5 [& Q; O8 {  A{  W0 d3 \0 S1 {5 n, [/ Q5 ?$ o1 r
            comp temp, xtimesy;
    - ^: U! I7 R0 W: o        xtimesy.re = 0;6 T: e/ F! U  K
            xtimesy.im = 0;
    , A& n) C, p9 Z+ Z0 m" i& v. W        int j0 = lenB - 1;
    9 P& {  `5 o6 S$ c$ H( b* b        int    i, j, i1, reali;/ I$ p/ L  b7 u- t; a
            if (lenA % 2 == 1)
    1 N4 J. T: y& M6 F/ _* ]! Q                reali = lenA + 1;6 h% F0 a/ j/ e+ ~
            else
    ) Q5 ~; z: ~$ l; Q: R- G2 K                reali = lenA;) }' a  g. @& x6 D
            reali /= 2;
    3 ^+ _' P- L, J  ~( v$ Z8 v4 S- k6 ?
            int nconv = reali + lenB;
    " J1 @  w& C% Y; z8 O        //#pragma omp parallel for$ T3 ^  _( [+ c* o- o
            for (i = reali; i < nconv; i++)+ r6 O( T  ^7 ~, V8 F$ Z
            {
    * n+ v$ \0 _; s( b                temp.re = 0;! l# H! A  [/ @
                    temp.im = 0;
    , F7 K2 V4 j' {: p                i1 = i;
    5 `2 F6 v/ W0 x+ e. P                for (j = j0; j >= 0; j--), M3 D7 i5 l8 ], R( |
                    {+ e4 Y& J* K, v
                            /* floating date operation */9 w/ x7 _* E8 k: Q) [
                    }

    ) _! a- `6 d: F7 [0 R        }
    * A+ B3 s/ ~% G7 {7 V}  V5 G6 M$ N+ a8 j2 Y5 [, s( ?
    + M8 M) m8 Q4 n' J4 d4 Y0 t  \# ^
    xcorr函数代码如上,comp是复数struct, 做过长度为11、19两个矢量的测试,和octave结果完全一样
    * K9 v1 n8 f& V1 l: z) M" g# b9 S
    红色部分是内循环,现在其内部操作都comment out 了, j0大概是 6000。2 V3 I9 ?2 v/ J! |3 p5 r5 ?
    现在call xcorr 100次,耗时78s.
    ' G) Q1 D1 E. F' u, U/ H' v! S8 Z4 c. P
    如果把红色部分内循环本身完全comment out, call xcorr 1000次,耗时 <1s. - E7 t3 n1 c& s6 Z, l1 {$ x/ M( Y6 R4 F
    + {5 H2 _) J! E
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    6#
     楼主| 发表于 2022-9-25 00:17:17 | 只看该作者
    风雨无阻 发表于 2022-9-24 23:33! r) }9 H3 M' a' F
    Maybe Debug mode?

    . {8 O  G2 t+ M7 a* z% |
    / U. k! G3 s0 U3 u# F! i不应该,看我上面的回复。4 B, h. D: }- f4 p4 {9 a( [& C( V
    3 M3 C+ j1 V) N2 m; R
    我更怀疑是 VS 社区版的问题
    回复 支持 反对

    使用道具 举报

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

    [LV.Master]无

    7#
    发表于 2022-9-25 00:20:10 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 00:24 编辑 - T2 s5 }" e- h4 n8 X' ~  y
    雷达 发表于 2022-9-24 23:54
    3 O% T8 v0 v9 b( b' j, r; H% evoid xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
      h! x2 W/ E0 @* K{
    2 _7 Y; t+ P- Y4 g" t: C; p        comp temp, xtimesy;
    3 W+ T: b) u+ F; L8 ?

    # p- Q+ Q( g9 I2 z7 J4 x, c这个不是这么比的吧。。。
    - E4 \5 n+ E4 f4 M4 n: t6 J' I, n3 b$ P; W8 x
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。9 o  _* c4 a8 k
    + P& `/ Y1 R6 [5 U+ T
    而加上内循环,光jmp和dec指令就至少多执行了6000个,慢个几十倍不是正常的么?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    8#
     楼主| 发表于 2022-9-25 00:46:56 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 01:09 编辑
    5 Z7 H) g$ ^. g, \3 \* v
    数值分析 发表于 2022-9-25 00:20
      e. m8 ^' \6 U; [+ E& Z  `这个不是这么比的吧。。。
    " M- t9 x- a2 B/ u
    # K, C$ A9 n% f4 s/ y, V8 Z您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。

    6 q( ?- o3 |- @9 D3 O, Q; i0 q! u. @4 q; i/ h
    有道理。
    8 K3 Z5 V8 n  W4 O: J$ h所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,记得 numeric 库里有算向量内积的,我回头试试。
    $ n1 Y2 \; z8 d) m# ?# A. g
    / w: g7 x" O# x+ Z0 p我先尝试尽量用标准库,一个小程序,不想搞得太复杂。多谢了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    9#
    发表于 2022-9-25 01:27:53 | 只看该作者
    雷达 发表于 2022-9-25 00:46
      ]: |' H2 i- D8 h1 |2 s有道理。5 t: `, v+ o2 W# g
    所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,这大 ...
    $ B+ g# [9 H6 H1 |
    你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子,把循环本身翻译成机器指令loop或dec/jnz,两者速度上会差很多
    5 y4 h* y3 S/ vWhy is the loop instruction slow? Couldn't Intel have implemented it efficiently?
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    10#
    发表于 2022-9-25 01:48:51 | 只看该作者
    数值分析 发表于 2022-9-25 00:208 }- E+ h4 ?5 I. a+ `  ]
    这个不是这么比的吧。。。& K% r' }  w7 E0 N2 u# H: a; w+ Q

    ) K: ^& E4 [$ t% K$ P" @+ f' D您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    而加上内循环,光jmp和dec指令就至少多执行了6000个

    ! p8 e) d  S& r- L, W. t+ K$ R. p! J% Q  \
    现在的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 编辑   h0 u0 m" C  W; [
    沉宝 发表于 2022-9-25 01:48
    5 l* p0 Q" \6 o7 Y* u& s3 N& A现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果 ...
    1 x! b1 e3 O$ {: Q3 O+ h1 T
      I0 i, c! Q+ j# b3 r- z% ]
    是的,兄台说的对。1 g( \* B' U2 s3 H: F! w9 V

    * E7 S9 i  r. ?其实我想说的是 真正数值计算部分和代码中其他不直接计算的overhead的比值这个事儿。- d7 _9 g! u' k) [

    0 m" ?2 _+ ?: `) S0 v+ y* M# g雷达兄构造测试用例的时候,屏蔽掉了所有计算的部分,使得剩下的都是overhead,这样run time比较的结果就显得好像不合理了。如果把计算加回去,计算部分的run time会dominate,结果就不那么离谱了。因为不好说,所以用指令数对比的方式试图直观地说明这一点。
    % S( f0 ^! k+ H5 ^3 B
    " q/ w5 N0 ~. n* c9 J8 t比如说,如果有计算,那么跑六千个循环相对于计算应该用不了多少时间。但是如果一边是什么都不做,另一边是六千个循环,那六千个循环比什么都不做慢几十倍了,就不是那么不合理了。/ B" h$ c6 t. [1 f
    # z) x: ]' z. F6 O* U, Y7 D
    当然也有可能像兄台说的,是优化参数的问题,但我觉得更多地是测试用例设计的不合理。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    12#
     楼主| 发表于 2022-9-25 04:47:43 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 04:49 编辑
    + L6 ^5 C6 ~1 N; C$ \
    沉宝 发表于 2022-9-25 01:276 w8 P7 z: y6 y. v- J
    你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子 ...

    . o$ c8 _) k% k3 i& ]4 n% Y; r4 q
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差一倍,我上面这个差的太多了。8 o8 [7 M9 ]) p" e3 J+ w" Y: M
    " k" T- g, T( O1 K8 Y
    我已经完全懵了。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    13#
    发表于 2022-9-25 05:51:23 | 只看该作者
    雷达 发表于 2022-9-25 04:47
    . S9 u# S" w  u/ A又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...

    * Y- c! m, U: w1 v6 p* r时间差一倍的结果可以接受。" H/ m0 }. }- `9 h7 e4 ^4 ?! W; w
    1 ]: A$ F. i  }
    你还是用profile工具看看吧。现在大家都主观瞎猜。
    回复 支持 反对

    使用道具 举报

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

    [LV.Master]无

    14#
    发表于 2022-9-25 14:58:59 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 15:38 编辑 + @! q+ S/ u: b4 `, x* T" }, W" p
    雷达 发表于 2022-9-25 04:47. y& Q5 ^% r, F! C/ W. [
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...
    : j! C  i$ A) K' }. f- {
    . P( ?" ]8 H7 u& S& z1 g( E8 T

    7 s! X, i7 h3 u9 {  c
    + Y/ B  O5 k) S* q( ?* u能不能把这个也贴上来,看看和上一个有什么不同?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    15#
     楼主| 发表于 2022-9-26 01:30:03 | 只看该作者
    本帖最后由 雷达 于 2022-9-27 01:17 编辑
    ! Z9 v% j, Q8 i% A$ I  `. y
    数值分析 发表于 2022-9-25 14:582 T7 w" f/ K6 u
    能不能把这个也贴上来,看看和上一个有什么不同?

    7 K( D3 R2 I! v6 A理了理思路,重新做了一个测试。" b7 z/ O6 U2 W2 P: f. m. N
    做了两个 vector 和 两个 float *, 都长 100000
    4 n9 F- J; I" d外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache., p2 d! z0 q, W3 I" m, R- ~" `
    8 `3 J2 W) v2 a
    内循环试了4种方法,: ^' Y% Q3 W) w7 C
    1. 直接调用 vector inner_product 247s
    # S* B4 b  c* l9 b' e# \7 y2. vector 循环点乘累加 237s5 o, w4 O3 v6 n# ^' |; Y# d
    3. float * 循环点乘累加 204s! q: v6 Z9 x4 O3 p# `, f, p
    4. 空循环 100000 次 202s) X  T9 L. ]5 [" ~+ W

    . y8 ?# U8 Y8 D4 V+ O" P, Q: l不做内循环 200s& U* G4 g' S) T$ C# Q

    ; n5 }- \& M# N8 n! d" f你昨天说的对,内循环本身占比是很小的,大头在其他处理。
    ) n" c& H; P  ^* N( P& I3 u另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。! f3 c( V4 g: Y  _
    6 r4 P2 n) m$ E# [! m
    至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)9 ?& d) L' `  @& F3 |
    + g% h0 @& i1 [$ T
    (为什么下面我贴的  b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成  jj 好了,原来 方括号里的 i 是斜体标志  LOL)
    8 J  v/ P0 T4 C0 b6 \0 r+ v2 D0 H) L/ v( a9 C" B6 x
            std::vector < float > vec1(N);
    ) I& z1 g5 w8 U8 z/ L        std::vector < float > vec2(N);& U1 H) b: w9 V6 [
            float* b1 = new float[N];
    * A  v, ~3 Q) c( ?9 V        float* b2 = new float[N];; e7 n% C. W2 A& V, q: l# R

    ) J% f8 N  y" L$ M1 |) q, v) q        for (int j = 0; j < 6000; j++)
    ( n4 F- L: _; H* D4 O8 ?5 M' r        {
    " ?! ]  Y; g" o, U9 d! ]  [9 Q                std::generate(vec1.begin(), vec1.end(), []() {- G  ]& q* [  c2 d8 ?7 r5 O
                            return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;4 d3 \1 P0 v8 K3 |: f7 H
                            });
    8 b; j" G, C, a1 ~  ^; u+ u1 w2 K; i( W, X) E$ Z( S% X
                    std::generate(vec2.begin(), vec2.end(), []() {* T! K1 L  z+ m9 c. R
                            return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;* B# X5 K$ b. f' V$ h( K/ K# x
                            });
    " D7 _- l% g) T- F' |- T# ^  B' w# c, X
                    for (size_t jj = 0; jj < vec1.size(); jj++)
    ( h1 o. G1 `, c/ P7 K, U                {* ?6 D. g9 e$ S6 T+ y& j
                            b1[jj] = vec1[jj];( ]. n* e5 @% N7 ]* Q, j
                    }
    8 n) B. o. i, L  v2 V! N8 b
    & R8 T7 M8 g+ k8 ~( M1 Y                for (size_t jj = 0; jj < vec2.size(); jj++)% _; G. ~; x7 t2 g( D
                    {( ]5 }+ F5 n; J& L3 e* b9 n- p
                            b2[jj] = vec2[jj];9 @; b2 _1 }9 Q+ `: D" E6 E
                    }+ T' N$ P8 I1 l3 k2 y
    * e/ u" _8 W1 T) W  N& @
                    //Method - 1  N=100000 247s  & H7 X+ l! ]- t1 I( I4 b6 }6 L
                    //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
    9 `7 g3 q. }9 @$ k: h. q+ \                                
    / n# H! a) G; u                //Method - 2  N=100000  237s
    6 z7 y# R5 y# O                /*
    * w' m/ b# y6 h7 T: c# \) ^, k/ }                for (int jj = 0; jj < N ; jj++)4 |; e$ e. u0 z
                    {
    6 j8 v5 q/ C& w2 Q                        fresult += vec1[jj] * vec2[jj];
    9 T" |2 X; Z9 V" G3 X( m                }. ~  V5 l) c' n% i0 _1 F3 ?
                    */
    / G! W$ v+ U, G  O! k1 Z, _                                
    & W& ~/ S. [! O3 b                //Method - 3  N=100000 204s* `5 F8 B) S9 ?9 w
                    /*& F2 F) R( F* h, ~
                    for (int jj = 0; jj < N; jj++)
    ' M$ h0 G! Y" v, C                {* ]6 j3 d9 y, C( J6 i4 O, c
                            fresult += b1[jj] * b2[jj];; W6 g* Q* ?1 m+ y3 w7 O" U
                    }8 l/ g% @0 m$ [! X2 V# \
                    */
    ) h& @2 B* O. O  @
    - m8 w/ H  @7 q, `                //Method - 4   202s+ s( f( \6 N5 x6 F+ b+ j1 f$ W& @- L
                    /** [& _( l. b' K5 Q
                    for (int jj = 0; jj < N; jj++), `4 Z3 v4 {; g: E7 U' o
                    {9 Z8 p0 n; {# Y- s8 R  R
                            
    3 l+ a: }! h" m1 g                }+ V4 v, m  m# _# n
                    */8 C- `$ T+ K- x' s
                    //comment out all methods, N=100000  202s               
    - W" d  a6 C  X0 ~, \% j' K        }
    ; q, L8 M( J# R2 a  t
    $ X, i: W: e; ]# v0 Y# P        delete []b1;
    1 [; L4 i# v, a( X        delete []b2;

    3 x( A. T' @7 ^- S, k9 R, T
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    16#
    发表于 2022-9-27 00:15:38 | 只看该作者
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?
    7 I8 ]7 E3 K2 ?4 w. Y; x4 f' j
    8 T7 x4 Q% d) D6 J( R4 `; u你第二个试验里面的j在循环里面又重新定义了啊,你确定真的跑了6000次?, x: B& _' T8 W7 }. L
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    17#
     楼主| 发表于 2022-9-27 01:16:03 | 只看该作者
    机器猫 发表于 2022-9-27 00:159 Y. h2 H' f/ W8 Q
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?9 L( Q: ]# W& P5 J" H
    / c1 N# U2 |  y$ x: m. V8 S
    你第二个试验里面的j在循环里面又重新定义 ...
    + }* n" j8 P% B- j5 l
    内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL
    + `# |  T5 }4 d% J& ?* x) }
    ; J7 t# x' A7 K7 n3 M8 p不和它较劲了,瞎耽误工夫,我已经转到 ubuntu, 也准备顺便试试 avx2 向量化。
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    18#
    发表于 2022-9-27 02:06:58 | 只看该作者
    雷达 发表于 2022-9-27 01:16
    " z) y0 |" o- U+ i5 E内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL9 y% u2 h3 l  u% U: v' j; N
    3 Z/ _1 [5 W, L+ L7 e4 ^) ~0 i
    不和它 ...

    & i- A  v( B2 v. [$ k6 i- m' ]2 [" z- U) K5 R/ E3 ^
    不过可以试试我说的register变量。前一个试验j是混在一堆其它变量里一起定义的,很有可能是在stack上,这样内存读写会更多,要是再碰上每次都需要加载cache就更慢了。
    ' f$ j! e- v( @+ B1 O  U后面一个是在循环那里定义的,说不定编译器就把它优化成register变量了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

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

    使用道具 举报

    该用户从未签到

    20#
    发表于 2022-9-27 20:29:50 | 只看该作者
    雷达 发表于 2022-9-24 23:54( k' L& |/ v1 H/ d( w: y* d/ V  D
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)' L. o7 k* U6 F+ |1 o  _9 p
    {7 i5 b8 c1 a% p& a6 L
            comp temp, xtimesy;

    : S& G! @& g. w3 R6 L+ k3 `! z这个code里面如果Openmp没有被注释掉的话,那么temp那个变量应该是定义在循环里面,否则线程之间会存在争夺写入那个temp的风险。
    2 I0 ?+ ~  L+ {! G内层for循环如果没有内部操作的话,编译时应该被优化掉了,和你完全注册掉整个循环是一回事。可能你的编译设置没有打开优化?
    6 t9 ?" i7 _1 cVS社区版没有问题,我工作用的就是社区版,设置正常的话不会比商业版差。以前游说头头用Intel Compiler,他说不想花钱,而且差不了多少,就一直用到现在。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2026-8-28 07:23 , Processed in 0.077702 second(s), 22 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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