设为首页收藏本站

爱吱声

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

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2022-9-24 22:54:26 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
    C++ 比 Octave 慢好多,怎么破?2 O/ Z2 o. i) ^
    % i' {) ~' m7 ?- e9 h* w* V) O( H
    自相关两层循环,内层循环涉及浮点数计算,试验了一下把内层循环内部全都 comment out 只留个壳子,  但空的内层循环本身就把速度拉下来了,看来问题并不在浮点计算。
    . B+ h' m4 m5 T, h' p! W. W! Q* F$ S1 M3 K" C: j: z
    速度优化问题真的很有意思啊。+ ~! g+ I2 n( k
    ( M/ h, E7 j4 v
    欢迎大家继续讨论

    评分

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

    查看全部评分

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

    [LV.Master]无

    沙发
    发表于 2022-9-24 23:04:16 | 只看该作者
    拉下来?拉多少?
    + u" Q$ S/ ?8 u# ^! ]" l把代码贴上来看看?  Z/ U8 t& O8 T2 S
    9 B( T$ S3 ^0 a+ S7 b; u6 }
    难道分支预测不准破坏流水线执行?不该啊。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    板凳
    发表于 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 编辑 4 x; C' `6 f5 H! d: [
    数值分析 发表于 2022-9-24 23:04
    , f# `- \8 z3 z拉下来?拉多少?0 Y/ X' ?! J' L5 q
    把代码贴上来看看?

    * F# N+ g. v- ?. Q6 C% C  `! m9 Z
    ' |) [0 r# E! d6 B  s( Ovoid xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)) L  I, ~5 Z! P/ c# E& \; z
    {* z3 A4 ?$ f: R
            comp temp, xtimesy;
    6 z( ^* O. Z. |* r        xtimesy.re = 0;
    0 a4 O4 _! I8 W! l' A        xtimesy.im = 0;! G" t. M7 H, O7 x( \
            int j0 = lenB - 1;3 h) j. [1 m: r6 s
            int    i, j, i1, reali;
    0 i6 c3 a. N8 O; J6 c% M* F        if (lenA % 2 == 1)& _+ R# }: k! [' F2 f
                    reali = lenA + 1;
    8 w6 c+ N7 k( j; d7 m        else5 O* I) T( B0 |
                    reali = lenA;. |5 b9 Y" `9 \4 I9 z0 ^3 _+ G, K
            reali /= 2;
    . ^7 Q2 f. F0 m1 e) w5 P* a
    # N; h8 b1 W3 {, k0 F0 e* x% d" X        int nconv = reali + lenB;+ T( D7 X: L' x( q+ l, H
            //#pragma omp parallel for
    $ e2 P0 j5 M4 C1 {0 b* Z        for (i = reali; i < nconv; i++)
    7 b1 O5 S/ t. F, D/ k        {
    + T$ w: e! T: o' K                temp.re = 0;
    : v3 ^* V4 e/ @$ c                temp.im = 0;
    - F  l  W/ o2 b% }2 l5 U0 \4 B7 X                i1 = i;
    2 B+ ?. d: z- J$ Y% m" \4 q/ A                for (j = j0; j >= 0; j--)5 S8 A( G, L5 s5 N& ?
                    {& A: A/ @! }8 F7 K" V
                            /* floating date operation */0 W/ B# B' D  v6 C1 i, j" y9 e' G
                    }
    " y! l8 O# T/ t* X* K" h$ Q. n) V
            }# q% j  U/ w' O
    }6 [: i2 B9 [7 e' K% _$ p5 n

    . P) `- ?! m* c6 Jxcorr函数代码如上,comp是复数struct, 做过长度为11、19两个矢量的测试,和octave结果完全一样
    2 {4 W: ]4 ~" y4 \: b) Q) C) P" x5 G3 }  Z
    红色部分是内循环,现在其内部操作都comment out 了, j0大概是 6000。
    1 \8 ]9 q- A4 X2 S5 u- L现在call xcorr 100次,耗时78s.5 M6 A( G0 [! k9 u8 Q) ~

    / n# X- T, I/ L% m$ W如果把红色部分内循环本身完全comment out, call xcorr 1000次,耗时 <1s.
    , P4 P9 j2 d" U5 |7 k8 n9 o2 {+ \, [8 D" z$ C  m" A$ |( x
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    6#
     楼主| 发表于 2022-9-25 00:17:17 | 只看该作者
    风雨无阻 发表于 2022-9-24 23:33+ Y& O* f# }0 E; n! i! z
    Maybe Debug mode?

    % M; j+ X5 u9 \$ l- o# k) k$ N& I- Z
    不应该,看我上面的回复。/ _# ]4 d; a6 X. W# w
    ! N$ j( C; G; [6 P
    我更怀疑是 VS 社区版的问题
    回复 支持 反对

    使用道具 举报

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

    [LV.Master]无

    7#
    发表于 2022-9-25 00:20:10 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 00:24 编辑 ( x3 P$ W( ]0 T. X. S2 z
    雷达 发表于 2022-9-24 23:54
    1 r0 S5 A9 f6 l0 kvoid xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)  l! l1 F" v$ _. |$ \: C
    {1 k" ~! C" k6 ?/ X9 ~
            comp temp, xtimesy;

    # q/ _6 H9 ~8 K
    # H8 F: i- G; }! g! j这个不是这么比的吧。。。& g+ y% E& E  \+ A
    $ t( h7 b# k! s: E
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。, E. @1 _* _! Y) ?, x

    ) x( W( _% K" P7 F+ w3 J而加上内循环,光jmp和dec指令就至少多执行了6000个,慢个几十倍不是正常的么?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    8#
     楼主| 发表于 2022-9-25 00:46:56 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 01:09 编辑 " z: w- W0 k# K# J
    数值分析 发表于 2022-9-25 00:206 ]' v* \7 ?; @' m" ]  ^
    这个不是这么比的吧。。。  y& I- f$ R+ I+ U
    6 ?' B9 {5 _( E7 ^! w
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    + ]' ?- g/ m( Y" i9 v8 B# e% N
    8 \' X3 P. N* `# k
    有道理。
    8 Y, Z' Y- R7 `2 I$ U; x& U# {2 ~所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,记得 numeric 库里有算向量内积的,我回头试试。1 e$ F2 f9 [7 u+ o$ r/ M

    * j' \9 J& u/ m. G5 p, ?9 R我先尝试尽量用标准库,一个小程序,不想搞得太复杂。多谢了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    9#
    发表于 2022-9-25 01:27:53 | 只看该作者
    雷达 发表于 2022-9-25 00:46
    ! i( h1 ?! W9 m7 v# p- y  y有道理。: Y6 Z- {: Q" K8 ?
    所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,这大 ...
    , V! e, G/ r, Q9 w+ E/ Z
    你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子,把循环本身翻译成机器指令loop或dec/jnz,两者速度上会差很多
    $ Y' ]. H7 j; b  y1 }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
    $ x  \8 Y  m& Q9 e2 u5 t+ g0 x这个不是这么比的吧。。。1 B  p" _( I4 l
    7 N4 o# m5 t; G" P3 }
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    而加上内循环,光jmp和dec指令就至少多执行了6000个

    . Q3 c; D8 G* |1 ?6 J: O4 X4 S4 j% x% h" w0 X6 Y
    现在的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 编辑
    $ I" p0 i0 Z' P6 o' o
    沉宝 发表于 2022-9-25 01:48
    : G6 I1 E. T5 d$ T1 h现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果 ...
    / _/ G' k) @# M+ }7 s
    : f% P8 a' P% y& P' a  |
    是的,兄台说的对。1 K8 o9 g  M" B# _
    " q; a8 Q) P) k1 v9 S/ W
    其实我想说的是 真正数值计算部分和代码中其他不直接计算的overhead的比值这个事儿。) ?  n. C& Y' C; @' M+ |
    ' D  X0 T1 {& ]* }$ }7 U- \8 }* N- j
    雷达兄构造测试用例的时候,屏蔽掉了所有计算的部分,使得剩下的都是overhead,这样run time比较的结果就显得好像不合理了。如果把计算加回去,计算部分的run time会dominate,结果就不那么离谱了。因为不好说,所以用指令数对比的方式试图直观地说明这一点。
    $ D6 Z7 F( l% s( ]
    $ U) M6 ~: l* ]7 ~* g$ f6 f: e比如说,如果有计算,那么跑六千个循环相对于计算应该用不了多少时间。但是如果一边是什么都不做,另一边是六千个循环,那六千个循环比什么都不做慢几十倍了,就不是那么不合理了。3 z" h8 F2 H+ j/ s5 B9 Y( A7 {

    3 q7 {3 C' v& h3 _' |$ m当然也有可能像兄台说的,是优化参数的问题,但我觉得更多地是测试用例设计的不合理。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    12#
     楼主| 发表于 2022-9-25 04:47:43 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 04:49 编辑
    3 `4 P" N% V, O
    沉宝 发表于 2022-9-25 01:27
    5 z5 \. J/ c5 w0 @你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子 ...

    - o4 Q; W. z) o0 G9 ?$ H
    0 c: P% {; h; D& q: ~又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差一倍,我上面这个差的太多了。( z0 R; G+ C; s; J8 C

    ; q2 |6 C8 l3 x我已经完全懵了。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    13#
    发表于 2022-9-25 05:51:23 | 只看该作者
    雷达 发表于 2022-9-25 04:47
    : z" x) g8 X1 G4 t6 H3 `! k; C3 M又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...
    # R$ m8 R  e( t/ o
    时间差一倍的结果可以接受。5 ^/ f+ Q* F+ s" v
    ( H. T8 o( w8 N' d
    你还是用profile工具看看吧。现在大家都主观瞎猜。
    回复 支持 反对

    使用道具 举报

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

    [LV.Master]无

    14#
    发表于 2022-9-25 14:58:59 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 15:38 编辑
    . x+ ^0 h4 ~  C7 t6 N- a! r
    雷达 发表于 2022-9-25 04:47& \' u' ~, E% V: x7 ~
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...
    , g9 I) j' y3 ~4 p( X/ E
    # a& i2 Z2 y& D

    2 u' K6 h$ \0 R) G$ }+ G
    " q( E1 ^. b. n9 ]' h能不能把这个也贴上来,看看和上一个有什么不同?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    15#
     楼主| 发表于 2022-9-26 01:30:03 | 只看该作者
    本帖最后由 雷达 于 2022-9-27 01:17 编辑
    * D( u$ D+ G; n
    数值分析 发表于 2022-9-25 14:58
      ]9 {$ }- n- }. P, {( Q. L能不能把这个也贴上来,看看和上一个有什么不同?
    0 z1 x  U( [6 a' [  }) L
    理了理思路,重新做了一个测试。+ t- y6 `" Q; H2 }! b& F' q2 V
    做了两个 vector 和 两个 float *, 都长 100000
    - }7 p; x: j) `9 u外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.! I8 @6 ~% q: p4 }( {) n; p% u  c
    1 b$ p1 s2 w0 b$ C" O$ X
    内循环试了4种方法,
    - g! l. ?  U7 y# O1. 直接调用 vector inner_product 247s
    0 s* J$ k, N) O0 M5 s2. vector 循环点乘累加 237s
    $ C% f4 r' f& g8 Q3. float * 循环点乘累加 204s
    ' R3 T; P9 l- M6 l  U% D5 o4. 空循环 100000 次 202s
    + K; l- v; g# A9 s0 P3 g# t
    2 u5 r8 r0 N! p6 V- [3 l( q不做内循环 200s
    ) d3 M& A, n; B, V5 R/ I: Q! {# e, y+ o, o6 ~
    你昨天说的对,内循环本身占比是很小的,大头在其他处理。' k9 j+ E9 g" s. L1 h; {1 w
    另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
    7 z; W7 z2 g5 z6 |; k9 l/ R% e0 v- R# `1 z# ~( T3 d- a: V
    至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
    ( p& s0 L+ Z3 `7 x5 |2 R4 G0 D& ~1 @- R! m2 K  }
    (为什么下面我贴的  b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成  jj 好了,原来 方括号里的 i 是斜体标志  LOL), F. _( ^/ v1 z$ @5 c/ C
    . k  \( S, m6 _! O9 I, u+ W8 F
            std::vector < float > vec1(N);
    3 r) W9 Y8 Y0 V  W" Z$ _+ r! E        std::vector < float > vec2(N);
    ( W1 x* v- A+ C! `        float* b1 = new float[N];( F. `$ L/ `3 c) @3 N, D1 w7 o8 R5 X
            float* b2 = new float[N];
    ) V) R1 ]9 z. @* q5 ~5 M/ @" a& m- J0 E, G: E
            for (int j = 0; j < 6000; j++)
    0 G6 B# G7 F2 A9 w/ {        {" C( z# ?3 t! z8 |
                    std::generate(vec1.begin(), vec1.end(), []() {
      t" }- M8 }, i2 ]0 D                        return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;- J* A' h' m7 b3 u( P- {! P
                            });
    " q% q+ f( E+ V" `. i+ m6 |9 _7 U( j- z/ L: _
                    std::generate(vec2.begin(), vec2.end(), []() {
    / _* r/ C! P% w! }                        return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;  r& v* I  K- }1 e
                            });
    0 g* s4 ?% `: ]" V1 X  i  O) s$ R+ |7 T. o1 {! V: [7 G3 T
                    for (size_t jj = 0; jj < vec1.size(); jj++)9 }& Q+ t# W3 Y3 n: q
                    {
    0 M9 s3 \/ [; O. @# G# n                        b1[jj] = vec1[jj];
    % _+ I' z4 x- {6 B# e) P& E                }7 Y9 b0 ^9 l' v3 }6 P

      n% w/ w' b* b6 t' E6 Z  g                for (size_t jj = 0; jj < vec2.size(); jj++)2 Q% p0 _4 `. ?' [" t
                    {
    7 [: ]% e( B+ S& U9 ?! }                        b2[jj] = vec2[jj];
    5 _) [. q( m/ r9 q1 K4 R                }
    / I. H! r  A3 F# ?! b4 x: k$ @+ M- A% L) N. Q% r0 E! C
                    //Method - 1  N=100000 247s  3 E1 @- H7 s6 h  r* H4 c
                    //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);1 D% A. [* C# D2 d6 h
                                    
    ( D5 z8 S  S- A% j/ ?                //Method - 2  N=100000  237s8 X, }9 |3 k4 f& Q& c" d: \
                    /*: y$ O. F) U$ L# H( _5 v0 i, F
                    for (int jj = 0; jj < N ; jj++)
    * K1 W9 h4 u3 G5 \" V                {
    3 G8 _& C) E; k% q, P  D                        fresult += vec1[jj] * vec2[jj];1 ]* t, C+ X. O; [6 U
                    }
    8 f$ @. i  k1 d                */
    + |$ Q% k3 c; O                                5 @9 [' v. R/ x9 l' l
                    //Method - 3  N=100000 204s
      |4 U3 v3 K$ I; F5 R                /*
    0 I: I2 c8 B! H1 e$ b                for (int jj = 0; jj < N; jj++)
      ~/ x# S7 U9 b8 M/ N                {& X( b; O6 C' m
                            fresult += b1[jj] * b2[jj];9 l+ K( ^3 b8 A: P
                    }
    % s' _4 n- |" m6 p0 t6 W6 Y4 c                */
    & U6 f7 W7 d$ n4 {( t/ [2 c' v: G% O; S: \: a0 P! z
                    //Method - 4   202s
    - i+ ~4 x  z3 x, f3 S* t- [& _                /*3 }2 C1 l7 L5 L4 w* q6 T/ g
                    for (int jj = 0; jj < N; jj++)( Q+ v" [" ^, C6 T  Q# R/ [
                    {  E  h. T- e! w4 H2 [3 N. v5 W7 S! K1 R
                            
    7 @7 N6 {, V( c                }" [7 l7 k% k- b3 U
                    */
    / F) G3 ?2 h: Z. U) U7 G6 V5 w2 F  M                //comment out all methods, N=100000  202s               
    ! m9 |( q  S; P# R; o/ o) f        }* D4 I( |+ M% s0 b- k) K$ A1 u" j

    1 V* G: Q, r$ y7 `6 X  S7 r        delete []b1;
    7 ?  G1 [, F6 I4 b( A        delete []b2;
    8 a# w$ @* f1 J" @
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    16#
    发表于 2022-9-27 00:15:38 | 只看该作者
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?
    + M' K0 i6 D3 N' w' |
    ) q0 R' [. d4 Q6 U; ?+ K: M! ?你第二个试验里面的j在循环里面又重新定义了啊,你确定真的跑了6000次?
      a' \# a% }: `7 J
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    17#
     楼主| 发表于 2022-9-27 01:16:03 | 只看该作者
    机器猫 发表于 2022-9-27 00:15
    5 c1 N0 C/ ^5 w! V6 q# F" V瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?/ d  r9 t8 g7 R  e, S
    1 d1 p8 Q3 n! H5 ]% G3 |& @
    你第二个试验里面的j在循环里面又重新定义 ...
    $ D9 C% N, Z  A4 t3 p8 r( ]
    内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL' Y+ }9 F; a! |7 E7 l2 Y1 Y/ T
    ) U: \9 f' V0 B
    不和它较劲了,瞎耽误工夫,我已经转到 ubuntu, 也准备顺便试试 avx2 向量化。
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    18#
    发表于 2022-9-27 02:06:58 | 只看该作者
    雷达 发表于 2022-9-27 01:168 R) |8 }! `: R. n$ v
    内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL
    / b/ I; F9 I, t7 u
    + k& K9 P$ n; L# i不和它 ...
    % `0 ~0 S- G5 K. i% A

    & P9 v7 e' b( z4 Z不过可以试试我说的register变量。前一个试验j是混在一堆其它变量里一起定义的,很有可能是在stack上,这样内存读写会更多,要是再碰上每次都需要加载cache就更慢了。
    ! {9 L+ x6 d: b" l% f9 @, A3 ?后面一个是在循环那里定义的,说不定编译器就把它优化成register变量了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

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

    使用道具 举报

    该用户从未签到

    20#
    发表于 2022-9-27 20:29:50 | 只看该作者
    雷达 发表于 2022-9-24 23:54( Y: q$ E5 ^4 Z$ d5 i& g
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)# s. _0 O' ?1 e5 B/ r$ Z; M3 a* L  w
    {
    ) b4 g& P. P) K        comp temp, xtimesy;
    " S9 G0 V7 T1 a1 E% i
    这个code里面如果Openmp没有被注释掉的话,那么temp那个变量应该是定义在循环里面,否则线程之间会存在争夺写入那个temp的风险。4 G) a, ?% i  P7 K; E- a
    内层for循环如果没有内部操作的话,编译时应该被优化掉了,和你完全注册掉整个循环是一回事。可能你的编译设置没有打开优化?
    - u3 u2 Y! x" i3 nVS社区版没有问题,我工作用的就是社区版,设置正常的话不会比商业版差。以前游说头头用Intel Compiler,他说不想花钱,而且差不了多少,就一直用到现在。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2026-1-22 00:21 , Processed in 0.093780 second(s), 19 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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