设为首页收藏本站

爱吱声

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

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2022-9-24 22:54:26 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
    C++ 比 Octave 慢好多,怎么破?
    ! H) T; S; ^6 _. s1 N" [/ x6 _& q3 o
    自相关两层循环,内层循环涉及浮点数计算,试验了一下把内层循环内部全都 comment out 只留个壳子,  但空的内层循环本身就把速度拉下来了,看来问题并不在浮点计算。
    9 |/ v2 k, Y' _6 R! I$ \
    ( f/ M3 x( }+ h速度优化问题真的很有意思啊。. M! J2 [9 |8 T/ v/ K- ]7 K. s
    " e3 z1 I' v. c  |/ a
    欢迎大家继续讨论

    评分

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

    查看全部评分

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

    [LV.Master]无

    沙发
    发表于 2022-9-24 23:04:16 | 只看该作者
    拉下来?拉多少?
    3 N0 V# s) l3 ]8 E/ ?4 ^8 ~! I把代码贴上来看看?2 ^8 m$ ^: Z- @) A% T8 f  U
    0 e) r' W: _9 u0 _0 C% M
    难道分支预测不准破坏流水线执行?不该啊。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    板凳
    发表于 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" K9 j& e* g) N. u
    数值分析 发表于 2022-9-24 23:04
    / z0 N) k" ~% {& n拉下来?拉多少?
    0 v: [5 X. A- ?, {5 t把代码贴上来看看?
    6 d3 p) I' @+ y: m

    5 M+ M5 W  k+ }0 U( t& Fvoid xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)5 N  m# H* e, W5 Z: x
    {
    4 ?4 C1 G( A$ y        comp temp, xtimesy;
      s' t5 i7 s/ Y6 B  A$ ]/ X        xtimesy.re = 0;" W& C  g/ m3 P; W7 [4 Q
            xtimesy.im = 0;
    # }) h9 f; D9 Z9 b& I        int j0 = lenB - 1;) F3 M/ p, N! G1 d
            int    i, j, i1, reali;
    1 ^8 i" ?5 k6 i; x        if (lenA % 2 == 1)
    9 A  G9 R; m' l) R; Y+ S                reali = lenA + 1;
    ; i! G( V! N- f1 M( y7 R5 K4 ~        else+ p$ N+ e& {/ g& N& F
                    reali = lenA;
    ; v0 V% o% u1 y# M- m7 h        reali /= 2;2 k6 m6 Z8 U3 o( R

    6 H" G8 s4 p: w1 H$ ?% c/ Z' e+ b        int nconv = reali + lenB;. F7 p% `3 E% g
            //#pragma omp parallel for/ ]6 M* {% X8 M2 }* u
            for (i = reali; i < nconv; i++)4 d2 t$ J  W+ d
            {* o+ J3 y% Q9 w' O
                    temp.re = 0;
    0 P8 |% B7 t7 U" ?9 [/ ~                temp.im = 0;2 a# a  _. f* ^+ C: `
                    i1 = i;
    ; A7 E# z3 C0 ^6 d1 w                for (j = j0; j >= 0; j--)  [2 R  ]( p7 F
                    {, e5 [3 S* |* E  C( D( N
                            /* floating date operation */7 j, g. K# R* C# Z5 @9 e+ m
                    }

    7 _( F! L3 B! f0 |        }
    ' V$ R$ ^- Z# T3 l* H7 V}
    2 [/ @# D/ {" `+ O6 n0 l5 K% g* ~1 v0 b! }
    xcorr函数代码如上,comp是复数struct, 做过长度为11、19两个矢量的测试,和octave结果完全一样
    $ y3 V) b  E4 E) D3 b; c( r# t2 P0 M: s" p) _& r! }
    红色部分是内循环,现在其内部操作都comment out 了, j0大概是 6000。( Y/ E- ?8 ~7 ^) `' E( a% ]; l6 U, a( \
    现在call xcorr 100次,耗时78s.  E* G, U( g& e  q
    & U2 ?3 g5 Z7 a
    如果把红色部分内循环本身完全comment out, call xcorr 1000次,耗时 <1s.
    ) |3 V3 P- H8 t. ^# f- w4 {, B/ w/ q5 r8 K; n
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    6#
     楼主| 发表于 2022-9-25 00:17:17 | 只看该作者
    风雨无阻 发表于 2022-9-24 23:33
    2 A2 [; V4 P8 c; DMaybe Debug mode?

    2 [  Y; P& C$ W5 g
    # T2 i# J" R7 y- N4 o不应该,看我上面的回复。& b" e" a: Q* w% {1 q2 m- z

    ! ^2 \! ?6 {: p3 r- F我更怀疑是 VS 社区版的问题
    回复 支持 反对

    使用道具 举报

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

    [LV.Master]无

    7#
    发表于 2022-9-25 00:20:10 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 00:24 编辑 ; W2 x0 Y* J' r; }; ~9 ?9 G
    雷达 发表于 2022-9-24 23:547 ~& L/ j0 C, W4 }4 B6 e( \4 O/ N/ ]
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)8 A) Y( [+ @5 s/ l# s9 ^* X
    {
    + @0 j- ^7 [+ i: C3 T, p% W& K# f        comp temp, xtimesy;
    6 |+ S; ~8 y* I7 ^2 L

    9 G( M, l, a( @5 j9 {6 `9 j这个不是这么比的吧。。。
    / ^% a- v8 \% x: [" E) P: {
    & I4 p5 d; h+ n! K: `4 c( v" J9 s您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。: A; C$ |. `- G6 {4 K0 Y# Q% A6 O
    0 C5 O. x7 D, S: s7 f
    而加上内循环,光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, z7 x3 F6 u0 y/ _5 s  H
    数值分析 发表于 2022-9-25 00:20
    4 s# W, O$ T! v! q" J$ N+ e这个不是这么比的吧。。。7 ^: z$ I1 d: n

    / L6 b, ~2 G- D; [您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。

    2 y: D, R$ ]  i6 k3 ]  P, A( E8 V7 F+ ~5 S8 [! Y
    有道理。
    7 q# J, L  i5 H所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,记得 numeric 库里有算向量内积的,我回头试试。
    ) m8 C% [4 K7 h8 H* g
    6 R; Q; O9 f) Y" k2 @我先尝试尽量用标准库,一个小程序,不想搞得太复杂。多谢了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    9#
    发表于 2022-9-25 01:27:53 | 只看该作者
    雷达 发表于 2022-9-25 00:46
      g, c; u" B% z0 s! w3 n有道理。3 j1 \; W- `9 v, c4 h' i- h1 b5 R
    所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,这大 ...
    . g8 ]9 G3 N: n
    你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子,把循环本身翻译成机器指令loop或dec/jnz,两者速度上会差很多
    ' a4 Y; A5 _' ~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! U5 e' V- K- y& k; N4 {8 K
    这个不是这么比的吧。。。
    ) S5 \& F/ U8 C* z/ n* d  V2 }; B: B6 x# i" ~1 _( y6 y( {8 e* g
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    而加上内循环,光jmp和dec指令就至少多执行了6000个
    ) t3 r5 _( \* q% r( Y+ S% A1 K

      v3 @  s1 l' K& n7 h. o现在的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 编辑 & q9 _, r; L4 u2 g% {: \
    沉宝 发表于 2022-9-25 01:48
    / |4 a. u9 }5 S& i3 {$ l现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果 ...
    $ z9 a1 B" y. {, V

    2 i" C/ H0 I& Z- `9 z是的,兄台说的对。6 G5 g, k0 M1 s+ _! d( Z

    4 ]0 e/ l, v$ m% K7 O其实我想说的是 真正数值计算部分和代码中其他不直接计算的overhead的比值这个事儿。
    : M2 y: b/ j, k2 G5 }
    / K2 F# z) q! {* S$ e雷达兄构造测试用例的时候,屏蔽掉了所有计算的部分,使得剩下的都是overhead,这样run time比较的结果就显得好像不合理了。如果把计算加回去,计算部分的run time会dominate,结果就不那么离谱了。因为不好说,所以用指令数对比的方式试图直观地说明这一点。4 A& q, K+ ^6 i; b7 v9 D% g
    ' j. Z% l) Y9 ~7 j
    比如说,如果有计算,那么跑六千个循环相对于计算应该用不了多少时间。但是如果一边是什么都不做,另一边是六千个循环,那六千个循环比什么都不做慢几十倍了,就不是那么不合理了。
    , }7 H7 m! `* Y. @5 f
    . \6 H0 v$ |- y  ~* u, M当然也有可能像兄台说的,是优化参数的问题,但我觉得更多地是测试用例设计的不合理。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    12#
     楼主| 发表于 2022-9-25 04:47:43 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 04:49 编辑
    ) c: O/ E0 i/ j1 o& j' k2 ^
    沉宝 发表于 2022-9-25 01:27; m6 X  P# [% S( G1 q* ]
    你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子 ...

    * ~# V5 f! e; j# i% T: Z+ M; t' i+ ]/ W9 r* ~% {
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差一倍,我上面这个差的太多了。
    , J0 a! w. I; ^, V% j2 A; ?0 Y! B. \" o7 T
    我已经完全懵了。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    13#
    发表于 2022-9-25 05:51:23 | 只看该作者
    雷达 发表于 2022-9-25 04:478 T( N3 e0 `" T1 t) t7 o
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...
    1 W! |5 w$ V7 y- x  ^) W
    时间差一倍的结果可以接受。
    " Y$ i: L0 c5 Z( d! i6 Q# m. F( Q. B3 n9 w- }) t" \- V$ D
    你还是用profile工具看看吧。现在大家都主观瞎猜。
    回复 支持 反对

    使用道具 举报

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

    [LV.Master]无

    14#
    发表于 2022-9-25 14:58:59 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 15:38 编辑
    0 c- P: V- B0 a$ V7 U. u
    雷达 发表于 2022-9-25 04:47
    $ b: Q/ E/ W! ~& c- ?又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...

      @5 @6 x3 b; `$ G) r% e0 j
    ; n3 W( n# m$ L  b  W
    & u/ T2 V; f5 i2 y# m5 T1 L3 k2 A% p" Q- X" A% V
    能不能把这个也贴上来,看看和上一个有什么不同?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    15#
     楼主| 发表于 2022-9-26 01:30:03 | 只看该作者
    本帖最后由 雷达 于 2022-9-27 01:17 编辑
    * M: ^+ |+ M2 Q. A- d: d
    数值分析 发表于 2022-9-25 14:58
    1 [" n5 h; {& P1 r能不能把这个也贴上来,看看和上一个有什么不同?

    0 [4 P0 Q( {2 j7 x理了理思路,重新做了一个测试。) ~" I3 J5 Z$ i/ x! u" \
    做了两个 vector 和 两个 float *, 都长 1000005 A& Y1 _0 I5 T2 m: I: }7 ]
    外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
    & l$ B6 P) A2 c
    4 g" ^: g: w+ Y5 Q5 N1 i0 B内循环试了4种方法,
    * d9 x  S. |8 R9 X2 T6 p$ `1. 直接调用 vector inner_product 247s ; Y- u* `* ?  ?, z8 v
    2. vector 循环点乘累加 237s; P, w. l: h9 ^' p
    3. float * 循环点乘累加 204s/ A* i' @% U7 g8 X3 r1 @7 C7 }, p
    4. 空循环 100000 次 202s0 u2 h& m4 q( D7 U

    , M* A. [( I1 K不做内循环 200s5 O/ u7 [4 i( |. B& N! x' q, Q# o/ ]- |0 U

    $ ]* N, E' ?) R0 \0 n. K" V你昨天说的对,内循环本身占比是很小的,大头在其他处理。
    : x7 x8 h( x* k* k1 c0 Y另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。! k$ L6 w% ^! }% B; A
    ) I0 ^, @% M: r: x6 S! A
    至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)' V) c3 P* @5 K& T
    6 o+ R& ^. d* Q- Q) I
    (为什么下面我贴的  b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成  jj 好了,原来 方括号里的 i 是斜体标志  LOL)
    " Q: E$ E$ k; v: a$ o+ M: V8 \
            std::vector < float > vec1(N);: H# v& {, K  A4 U! A6 U
            std::vector < float > vec2(N);
    $ }9 ~9 Q. a( [# z, H4 j% K' w+ g: U        float* b1 = new float[N];
    $ {. P4 L; l$ V. d- ~        float* b2 = new float[N];
    # _" O2 Y4 N0 o( ^) B* T# u3 {1 Q/ \7 l6 y+ ^
            for (int j = 0; j < 6000; j++)( f: A- n3 U9 a/ B5 M- q; X$ V
            {
    / F0 i9 r! ]! W0 P                std::generate(vec1.begin(), vec1.end(), []() {  \% T7 ]. E1 t
                            return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;1 k2 R7 u  p/ E( }/ N7 [
                            });8 P' M0 F  c- ^7 O
    + @( u# O# T( p( D" _* f) O4 ^
                    std::generate(vec2.begin(), vec2.end(), []() {
      V* j1 P0 ~  R7 A  M                        return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
    7 a( Z4 n+ V# G& k1 e$ h, Y                        });3 d3 X+ m: O1 |  d$ c

      X* m% P3 p. H1 P                for (size_t jj = 0; jj < vec1.size(); jj++)- c$ l! N" Y3 V; r7 L& n4 m
                    {
      Z) c! Y( b. ^                        b1[jj] = vec1[jj];
    ( m* o0 d% n  {% u7 A; W9 A, D                }
    3 j0 n: l& ~& A0 H5 Y6 ^/ E3 S9 V+ Z3 {4 O7 |5 O
                    for (size_t jj = 0; jj < vec2.size(); jj++)
    ' V/ l! ~+ V# E2 c                {
    7 Z$ r/ O4 z8 |" ?$ H6 O2 g                        b2[jj] = vec2[jj];
    1 b; ~. k  c1 \7 s/ V1 A: I# B( c1 d                }' D- M2 I; V2 Q6 N
    $ _) _* K& O1 H5 I8 L
                    //Method - 1  N=100000 247s  3 Z) c" I; U) ?& h9 i# o
                    //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
    4 ^. B. A, @8 E9 Z                                
    2 a7 }, N5 I. Y5 u4 |                //Method - 2  N=100000  237s
    7 y9 i$ l2 m4 A) s4 d6 Y, T                /*
    ' I! S% Z. J6 ]% s9 M: y                for (int jj = 0; jj < N ; jj++)
    / N  c1 Z% N" W4 h                {
    , i, K- h" v. g1 ~                        fresult += vec1[jj] * vec2[jj];6 i: c; s5 D1 o! A7 M. R8 Q
                    }  V( f$ I8 l/ Q- h! |8 X: ]
                    */
    ) C* m  _, r3 l1 x0 ?/ x, W6 R                                
    + h/ T: m1 ]* R) `" E( }                //Method - 3  N=100000 204s. z. J2 x( u" _  ?
                    /*
    9 g+ ]$ }2 W$ }                for (int jj = 0; jj < N; jj++)
    4 b4 v2 N3 N, `, ?7 G                {  c7 p# C4 Q' j5 m- k, G6 w
                            fresult += b1[jj] * b2[jj];
    6 N) L3 V& l; q5 [+ G                }# D! Y/ j9 i, `  g0 o9 l
                    */4 r$ k3 ]' b& l

    7 u' o8 C+ c8 {1 c& l* O' Z                //Method - 4   202s
    # }0 r/ D1 B& I0 I0 l5 ~                /*, Z' A9 R2 [5 V" P( z" h5 U
                    for (int jj = 0; jj < N; jj++)4 n% G/ \" }) J  ^) L- d6 f
                    {( v5 g! P2 `9 H8 @) m
                            / G6 R& o9 F; r. G9 {# o  U
                    }9 h; ?; b& V  s+ h! A, B
                    */
    + B2 C, p3 H2 h" {7 Y& c* F                //comment out all methods, N=100000  202s               
    5 v8 \- {; u) }, P        }. ^9 V" ?+ P/ T: Y. F' C

    " L  Q" P0 l" \* x6 I" w        delete []b1;
    1 `  X" W3 ~& n1 Q        delete []b2;
    6 [9 o! O7 J, H) ?% L4 n
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    16#
    发表于 2022-9-27 00:15:38 | 只看该作者
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?& @) p- n1 G& V4 v/ s* ?6 e
    * t$ E7 v) S/ r
    你第二个试验里面的j在循环里面又重新定义了啊,你确定真的跑了6000次?
    5 Y0 k  L2 i- p7 p) {6 k2 d
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    17#
     楼主| 发表于 2022-9-27 01:16:03 | 只看该作者
    机器猫 发表于 2022-9-27 00:15% d( ]7 s+ z3 l/ m# B1 D3 K8 }( V
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?
    , K" N; ^4 j! i2 r# }- Q8 e8 s/ z# W
    你第二个试验里面的j在循环里面又重新定义 ...

    + |4 f, b" F( H9 S. m7 D/ E内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL) x9 [0 ~  j0 p8 t9 b6 D' m
    6 H& g8 l* G$ ^) F7 n
    不和它较劲了,瞎耽误工夫,我已经转到 ubuntu, 也准备顺便试试 avx2 向量化。
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    18#
    发表于 2022-9-27 02:06:58 | 只看该作者
    雷达 发表于 2022-9-27 01:16
    2 F0 C( a2 _( `! ^% x1 b4 n* s9 `内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL
    * C4 y9 G4 }5 r( Q+ ]7 R+ n1 i. r. C! c' s' Q1 O
    不和它 ...

    2 ?* w" P4 {5 O( D& y! @4 v" j  f* p
    不过可以试试我说的register变量。前一个试验j是混在一堆其它变量里一起定义的,很有可能是在stack上,这样内存读写会更多,要是再碰上每次都需要加载cache就更慢了。8 Y5 U( w' P) O6 P5 o0 U$ T3 @
    后面一个是在循环那里定义的,说不定编译器就把它优化成register变量了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

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

    使用道具 举报

    该用户从未签到

    20#
    发表于 2022-9-27 20:29:50 | 只看该作者
    雷达 发表于 2022-9-24 23:54
    * [2 k& Z" G. Y/ y5 \9 q1 b7 Lvoid xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)1 d; Q0 k) r. W
    {' E7 i+ J) K8 G2 N9 U- p
            comp temp, xtimesy;
    ) s; |6 z8 @# q/ Y8 k
    这个code里面如果Openmp没有被注释掉的话,那么temp那个变量应该是定义在循环里面,否则线程之间会存在争夺写入那个temp的风险。
    # I/ [+ f3 B! g3 c内层for循环如果没有内部操作的话,编译时应该被优化掉了,和你完全注册掉整个循环是一回事。可能你的编译设置没有打开优化?0 {( `5 P, \' V/ L; E+ ~: l* V
    VS社区版没有问题,我工作用的就是社区版,设置正常的话不会比商业版差。以前游说头头用Intel Compiler,他说不想花钱,而且差不了多少,就一直用到现在。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2026-5-15 02:20 , Processed in 0.067012 second(s), 19 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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