设为首页收藏本站

爱吱声

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

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2022-9-24 22:54:26 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
    C++ 比 Octave 慢好多,怎么破?1 q. f* r) V1 E3 a
    * w$ Q! ^$ g! m1 x
    自相关两层循环,内层循环涉及浮点数计算,试验了一下把内层循环内部全都 comment out 只留个壳子,  但空的内层循环本身就把速度拉下来了,看来问题并不在浮点计算。# O9 h, x$ c/ O5 n+ s; \

    0 u. L$ u4 l9 ^" _' B6 S% @速度优化问题真的很有意思啊。) V0 Y: N4 y5 M+ ^0 p0 e7 u4 z

    , {& A' R9 V4 q) D8 s欢迎大家继续讨论

    评分

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

    查看全部评分

  • TA的每日心情
    开心
    2025-12-26 03:23
  • 签到天数: 1954 天

    [LV.Master]无

    沙发
    发表于 2022-9-24 23:04:16 | 只看该作者
    拉下来?拉多少?: B- L2 I3 {8 D$ J
    把代码贴上来看看?+ D( `4 w( e! F- W/ T
    0 a' Z! W3 K8 J7 s9 J* t
    难道分支预测不准破坏流水线执行?不该啊。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    板凳
    发表于 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 编辑
    ) p+ Z. J0 H7 ?
    数值分析 发表于 2022-9-24 23:04; ]' c, H* x( c1 s
    拉下来?拉多少?
    0 F6 u& \4 ]/ X6 F把代码贴上来看看?

      x/ c( s: v) m. g: B2 ]: n9 ]+ A  l  N. [+ ~1 ?
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    4 X0 l. q1 N  X0 h& W% F{* V' O2 a1 v) y
            comp temp, xtimesy;
    8 P8 j. l# M5 [6 x8 D: C  h) G  H        xtimesy.re = 0;0 C' x; ]  \% `3 E+ h5 H
            xtimesy.im = 0;
    ; K7 e& a& }. p7 V4 T  L; a        int j0 = lenB - 1;1 p6 I7 \, ?, q; v, F
            int    i, j, i1, reali;
    # F6 j  c. a8 {. [& @. O; k- l        if (lenA % 2 == 1)
    : O* b' `( y0 c0 @# S, _0 }                reali = lenA + 1;5 |0 {9 G6 f3 H: G5 C" B
            else% t- R. l7 O/ T( x* l# X
                    reali = lenA;( L/ X( z# ~0 j+ a" f  i
            reali /= 2;$ r, T7 A0 [6 Q  G/ E

    ( X) v/ p. H" a+ U! f        int nconv = reali + lenB;
    0 Z! M! a5 u2 Y7 T( J        //#pragma omp parallel for; o. I5 c  t/ A9 c8 M# T7 r
            for (i = reali; i < nconv; i++)& U" _" q# ]5 [% S6 E5 @
            {' _. q0 A; W9 a, _8 f% S8 T. N8 W
                    temp.re = 0;
    ' W  Y2 K9 W6 C" p/ m1 x                temp.im = 0;0 T( a! {% C& t! l
                    i1 = i;' o3 a/ p: q: G( M9 J; I9 ]- N
                    for (j = j0; j >= 0; j--)
    & F$ C3 w/ r- q                {
    ; |: p) s5 |7 {/ G4 _- J; T3 K' @                        /* floating date operation */
    8 a: U: V5 ]5 P                }

    3 s) M  i2 m/ K3 D! E! N        }
    " ^1 u9 ]1 r$ S; k}
    ; N3 O9 Q8 y2 i: W* z2 z- F& y/ d0 A+ u+ X. G4 ?
    xcorr函数代码如上,comp是复数struct, 做过长度为11、19两个矢量的测试,和octave结果完全一样
    $ r4 K* @. z/ r( z( F* B9 S9 U- W, G( ~8 D! O# s- L! G
    红色部分是内循环,现在其内部操作都comment out 了, j0大概是 6000。
    7 ~* f. {1 }) \  {4 i* p* W) {现在call xcorr 100次,耗时78s.
    % s. _6 E& o( E8 C' y% e3 g5 P4 x: x; b0 {3 R
    如果把红色部分内循环本身完全comment out, call xcorr 1000次,耗时 <1s.
    - T+ s/ L, P3 r2 B) e
    4 Q# G/ E* f( y1 O
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    6#
     楼主| 发表于 2022-9-25 00:17:17 | 只看该作者
    风雨无阻 发表于 2022-9-24 23:339 I% q; n" r4 O" H
    Maybe Debug mode?

    " m1 s# S( q1 F. M$ @) L  c4 q) I2 y, `
    不应该,看我上面的回复。( L+ M  p$ y; X& a2 i; _

    : r2 q4 U5 W5 R我更怀疑是 VS 社区版的问题
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2025-12-26 03:23
  • 签到天数: 1954 天

    [LV.Master]无

    7#
    发表于 2022-9-25 00:20:10 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 00:24 编辑
    & m5 ~0 S) I/ j) g
    雷达 发表于 2022-9-24 23:54
    + P  b3 H3 g1 A. W, O  Dvoid xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)+ t( V7 i% x( r$ A7 W
    {" O6 n1 |; p' p
            comp temp, xtimesy;

    1 a4 m& l3 S2 p
    8 C8 v$ W1 F$ j7 T1 P这个不是这么比的吧。。。
    3 E! |4 b8 l, w1 ^4 O5 X' A
    5 c4 R6 X9 k3 y' M7 @您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    ' X+ P% O; K+ I: ^& W3 s) L0 e- R& l) t1 g1 v9 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 编辑 " r/ [+ U7 A* I" r6 x
    数值分析 发表于 2022-9-25 00:20. i1 |: M3 k+ _; Z9 E  M4 G, R" _
    这个不是这么比的吧。。。: E7 k1 }) [" z( N) N  b

    ) A& @. ~$ o$ y" c* [: {2 q2 d您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。

    1 E3 W; ?9 y8 {8 ^
    ( V: T! T: `; n8 Z有道理。
    9 y2 p; M5 F  p: B所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,记得 numeric 库里有算向量内积的,我回头试试。& x; W0 O5 u6 a( c/ c/ X# ~

    ) y0 T/ z/ K2 S6 y  s我先尝试尽量用标准库,一个小程序,不想搞得太复杂。多谢了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    9#
    发表于 2022-9-25 01:27:53 | 只看该作者
    雷达 发表于 2022-9-25 00:46
    / @+ D/ D6 D; G; _) U2 i' I0 F4 F  E有道理。5 l6 a9 [3 N+ [' {( m+ E1 e
    所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,这大 ...

    ( W& V/ f2 q2 o7 a. B你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子,把循环本身翻译成机器指令loop或dec/jnz,两者速度上会差很多
    7 N0 B7 W' C) h) S0 e* D6 U; A( FWhy is the loop instruction slow? Couldn't Intel have implemented it efficiently?
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    10#
    发表于 2022-9-25 01:48:51 | 只看该作者
    数值分析 发表于 2022-9-25 00:201 a6 W! U% u  R
    这个不是这么比的吧。。。8 m7 [) K/ c! N8 D4 ^

    : S1 H( f# f3 P( T9 g3 e您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    而加上内循环,光jmp和dec指令就至少多执行了6000个

    0 N. n3 v. [( h' M; S4 Y/ X4 `. ?" U" K% M* ]( B
    现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果循环这样跑,花不了多少时间。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2025-12-26 03:23
  • 签到天数: 1954 天

    [LV.Master]无

    11#
    发表于 2022-9-25 02:06:44 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 02:16 编辑
    4 q8 N, W) Y) P9 ]: L/ R" M8 o
    沉宝 发表于 2022-9-25 01:48* E9 I6 h, S! k/ o" `
    现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果 ...

    3 F, A2 m3 u) J( z) C* R
    8 P0 x% z8 [6 z: U1 N1 C是的,兄台说的对。
    0 T- J" N3 c# U: t0 V+ B, v2 B8 @) l5 x; Y: r0 H. f
    其实我想说的是 真正数值计算部分和代码中其他不直接计算的overhead的比值这个事儿。
    4 o, m# y  l) c; i7 q6 }" _; N9 O( g" Z% D
    雷达兄构造测试用例的时候,屏蔽掉了所有计算的部分,使得剩下的都是overhead,这样run time比较的结果就显得好像不合理了。如果把计算加回去,计算部分的run time会dominate,结果就不那么离谱了。因为不好说,所以用指令数对比的方式试图直观地说明这一点。
    , F) x" Q% D, Z$ D  R2 A# Q! Q8 ~' `
    比如说,如果有计算,那么跑六千个循环相对于计算应该用不了多少时间。但是如果一边是什么都不做,另一边是六千个循环,那六千个循环比什么都不做慢几十倍了,就不是那么不合理了。0 Z0 Z  z2 P) w& i

    ' F3 U& x" y" ?0 c& X' \2 d4 y当然也有可能像兄台说的,是优化参数的问题,但我觉得更多地是测试用例设计的不合理。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    12#
     楼主| 发表于 2022-9-25 04:47:43 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 04:49 编辑
    0 ^' \7 g( n: h
    沉宝 发表于 2022-9-25 01:27
    6 }/ K1 ~' A' E0 M2 W, d5 T: S你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子 ...
    / x& K/ v3 |0 ]  N* D3 C* w$ I

    * Y" o' o# q2 k8 l又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差一倍,我上面这个差的太多了。
    9 y# u' l$ [/ b6 M$ u9 H  `8 d* i7 i$ A
    我已经完全懵了。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    13#
    发表于 2022-9-25 05:51:23 | 只看该作者
    雷达 发表于 2022-9-25 04:47/ S! s! \7 T7 A; `; ~
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...
    * s5 l! b1 C2 d* V
    时间差一倍的结果可以接受。3 K6 t: R6 e8 N
    ; M6 w& S4 }  D5 l* @. H1 x
    你还是用profile工具看看吧。现在大家都主观瞎猜。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2025-12-26 03:23
  • 签到天数: 1954 天

    [LV.Master]无

    14#
    发表于 2022-9-25 14:58:59 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 15:38 编辑 - o+ I* {5 @: y
    雷达 发表于 2022-9-25 04:47
    $ V1 c+ I% l) j# T% P/ m; Q& p又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...
    # W7 v5 j) s+ N$ I

    # W, x6 g( i2 K# D- v- O4 O6 V' c0 {' f. W6 k8 M

    & o% q( J) C8 [1 F" g: Z( ]9 g能不能把这个也贴上来,看看和上一个有什么不同?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    15#
     楼主| 发表于 2022-9-26 01:30:03 | 只看该作者
    本帖最后由 雷达 于 2022-9-27 01:17 编辑
    7 d5 P# T8 p1 j& @4 d$ j9 ]
    数值分析 发表于 2022-9-25 14:58  F' a4 \  w* L; [( N2 w
    能不能把这个也贴上来,看看和上一个有什么不同?

    ' H. K# i4 j; y7 }; X理了理思路,重新做了一个测试。
    7 L2 t' e7 @' e! _" ]做了两个 vector 和 两个 float *, 都长 100000
    3 M' r# c8 `. v* T外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.2 J) j4 I: E" w6 |3 @  S( n

    $ n4 P  U" w% r' w( C4 F, S内循环试了4种方法,
    : Y% U6 h3 F! Z5 M7 @1. 直接调用 vector inner_product 247s : n$ f! }+ x  K7 a7 f/ K- q
    2. vector 循环点乘累加 237s& d# n: l0 R$ A  i% b. N( g
    3. float * 循环点乘累加 204s
    2 ]0 g# F- M, |" t( b4. 空循环 100000 次 202s  j* m, c" U% ^6 s; w# ?( N

    ; ]7 ?3 W  m: B不做内循环 200s
    + a' A/ S" g- U& k4 X
    ( `: H# n3 |: d' A+ z你昨天说的对,内循环本身占比是很小的,大头在其他处理。3 v$ K/ c* D" K
    另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。0 A) S' p2 `; ]$ p
    # \. l; v9 Z* c& Q4 T1 S
    至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
    ; _' L  `' A! `! R% \# ^7 V8 V6 |0 ]5 t6 Y6 A+ e0 z+ w$ |& y5 c
    (为什么下面我贴的  b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成  jj 好了,原来 方括号里的 i 是斜体标志  LOL)
    % p4 n/ B8 a: I2 E
    , A/ b' _/ x7 d5 ^0 s2 s; j
            std::vector < float > vec1(N);, Y3 |3 d* Z8 Q3 Z" J6 b
            std::vector < float > vec2(N);
    % x) Q& J8 U. M& W5 z3 Y- X, k( Q        float* b1 = new float[N];
    , f4 X- A- P2 M7 n6 R! x  M2 {        float* b2 = new float[N];
    $ C, a8 T! u' _! R+ q. r# J
    & z' |% W, N1 E4 W        for (int j = 0; j < 6000; j++)3 S, a  A9 D+ I6 }* W! x
            {
    ' Q+ z- o, w* Z: Q3 B9 m- v4 T$ l                std::generate(vec1.begin(), vec1.end(), []() {) b' M! x+ s7 F1 q& K9 y8 n
                            return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;, H2 u8 {5 D3 a5 d& ~3 @
                            });, [, ^$ y* H9 f/ d
    / q2 f& f2 h/ `' _* p9 z: N
                    std::generate(vec2.begin(), vec2.end(), []() {) z: ~" ^0 }; W  A" P
                            return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;! d2 E) w. u7 P' ~- l, F  T
                            });
    / h4 O& x# e5 Y8 A7 G
    : [, f9 O$ [; `6 D- g( B9 B- P* K" U                for (size_t jj = 0; jj < vec1.size(); jj++)" ^  Y2 D: i* p0 s% p! u4 u9 C
                    {  z' `& _0 d: E5 N$ G6 J# _
                            b1[jj] = vec1[jj];
    6 e& ]! f5 o2 g7 M* k6 z                }1 Q4 E  r6 u' d2 x  c3 J- \

    9 z- d  c2 X4 [: b3 T3 c                for (size_t jj = 0; jj < vec2.size(); jj++)
    3 l3 k' g: b; n: I8 V                {1 T1 E, d, L: j5 _
                            b2[jj] = vec2[jj];
    7 n2 L% y/ I. U# p4 @2 n                }
    . x! N9 m: x7 u8 v6 M- A) O5 I7 c. R. _9 E: |  O& y& Z. d( \3 M/ r3 o
                    //Method - 1  N=100000 247s  6 B1 }  m( @6 h  T: G- f( {
                    //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);1 _6 h7 U; |- T. I* Q
                                    - Q* `" e1 q9 w9 Y4 \3 i# O" k8 T
                    //Method - 2  N=100000  237s
    2 o; J2 T. ?4 M2 g                /*
    ! g* O) @3 N1 J( _                for (int jj = 0; jj < N ; jj++)
    % q& k: {% z4 u) e4 ^                {
    1 [  }3 o3 I  @6 a9 w                        fresult += vec1[jj] * vec2[jj];
    ) v, C  H3 F+ q5 }. @) l                }
    ' e% e+ J* H+ g& U7 J9 i4 d4 ^                */
    " [$ k2 ~( \7 G+ w; o6 l& f                                
    - P8 q" q4 f% S0 V- e                //Method - 3  N=100000 204s
    : C& A% d+ {  s3 _                /*: ~; g' ]/ \, j# \7 s6 v) E0 Q
                    for (int jj = 0; jj < N; jj++)9 g! ^5 }( W% g) i& i. s0 S
                    {
    $ V7 ?* \  w0 F  b& s) c% M4 p3 D                        fresult += b1[jj] * b2[jj];
      X$ o# _& F) p( E/ b: f                }9 `; c( s1 i2 d' l6 O5 E
                    */
    0 C, M+ \- R. e0 A- O; j; O$ }3 s3 B
                    //Method - 4   202s
    / t7 a1 u$ g, @5 o3 c0 v" e                /*
    ! y2 E8 H& p" h9 h- o                for (int jj = 0; jj < N; jj++)
    . ]* f5 [5 w6 A                {
    ) V( I9 \& W7 u9 Q4 i3 g9 \                        
      t9 X# v+ D2 i5 A+ x) y/ w                }# a0 f' |" J* s# k
                    */, M$ |' o/ f3 x. s. z2 f0 q1 n
                    //comment out all methods, N=100000  202s                4 ]. u% C- [& m, F2 X' G
            }5 b2 Y8 X; ~9 c" x
    " ]9 ^% y* j" m! N% l
            delete []b1;
    5 p1 L4 K$ d+ M4 P# y3 x2 _        delete []b2;
    $ h/ ?4 F8 p5 U$ B- k
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    16#
    发表于 2022-9-27 00:15:38 | 只看该作者
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?
    6 O1 D" |" B* b! O7 q* H
    1 q4 {2 j6 l! C你第二个试验里面的j在循环里面又重新定义了啊,你确定真的跑了6000次?
    3 h$ z5 d, ^; m- h- E2 H; d7 K6 \
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    17#
     楼主| 发表于 2022-9-27 01:16:03 | 只看该作者
    机器猫 发表于 2022-9-27 00:15
    . d, }9 {* |1 p. {. M2 g. F' }2 x瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?) I" ^. X% s5 a1 K9 d& R
    # i1 }, L& i) H$ k. l, I
    你第二个试验里面的j在循环里面又重新定义 ...

    7 N- Q' ^  c: w, P% _内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL
    0 R! `2 T& l+ [$ n9 h2 L- W/ Y/ n9 b" V+ o& p$ V# Y
    不和它较劲了,瞎耽误工夫,我已经转到 ubuntu, 也准备顺便试试 avx2 向量化。
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    18#
    发表于 2022-9-27 02:06:58 | 只看该作者
    雷达 发表于 2022-9-27 01:168 \0 K# l9 h' N0 k: O) _
    内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL7 M$ c3 }3 c4 m$ w* P: d9 _; z
    3 g2 X( x+ H: e0 `: W8 a
    不和它 ...

    0 s, q' D* B& H7 R& }0 t; ?4 D- _+ J
    不过可以试试我说的register变量。前一个试验j是混在一堆其它变量里一起定义的,很有可能是在stack上,这样内存读写会更多,要是再碰上每次都需要加载cache就更慢了。; U- T5 t0 _. v
    后面一个是在循环那里定义的,说不定编译器就把它优化成register变量了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

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

    使用道具 举报

    该用户从未签到

    20#
    发表于 2022-9-27 20:29:50 | 只看该作者
    雷达 发表于 2022-9-24 23:546 s  {+ V* C1 @% s5 n4 R
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    * e5 G6 U- K, d+ J. h% |% m{
    ) l; F( r( K, D- e        comp temp, xtimesy;
    " N3 b; e* ~5 `. c/ m( V) W
    这个code里面如果Openmp没有被注释掉的话,那么temp那个变量应该是定义在循环里面,否则线程之间会存在争夺写入那个temp的风险。: o4 W& Y# Z5 q% R  D0 c% v
    内层for循环如果没有内部操作的话,编译时应该被优化掉了,和你完全注册掉整个循环是一回事。可能你的编译设置没有打开优化?, Q' G6 O" H* H( f
    VS社区版没有问题,我工作用的就是社区版,设置正常的话不会比商业版差。以前游说头头用Intel Compiler,他说不想花钱,而且差不了多少,就一直用到现在。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2026-1-26 10:39 , Processed in 0.066445 second(s), 19 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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