设为首页收藏本站

爱吱声

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

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

[复制链接]
  • TA的每日心情
    怒
    2025-9-22 22:19
  • 签到天数: 1183 天

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2022-9-24 22:54:26 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
    C++ 比 Octave 慢好多,怎么破?# W7 z' {' a8 Q% o/ j5 L

    2 u4 h8 F- E0 a自相关两层循环,内层循环涉及浮点数计算,试验了一下把内层循环内部全都 comment out 只留个壳子,  但空的内层循环本身就把速度拉下来了,看来问题并不在浮点计算。
    & t3 Z3 u/ [$ |
      t# Q$ ?0 Z) ?5 }* j/ u% [8 T7 E8 M速度优化问题真的很有意思啊。% Z* S1 E5 H- D+ O: v+ i  V

    + _! T, @1 r. z8 V欢迎大家继续讨论

    评分

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

    查看全部评分

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

    [LV.Master]无

    沙发
    发表于 2022-9-24 23:04:16 | 只看该作者
    拉下来?拉多少?
    + f3 u) f# P1 Z/ I' v把代码贴上来看看?: k* ?( Y- y0 M

    ( c( B2 b4 y2 Y! T难道分支预测不准破坏流水线执行?不该啊。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    板凳
    发表于 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 编辑
    2 F  @1 T9 X: K4 `' Z
    数值分析 发表于 2022-9-24 23:04
    2 o' ~3 t1 x8 M$ C拉下来?拉多少?" }2 K/ _# L2 E+ _* b7 y
    把代码贴上来看看?

    ; X" U8 i" Y- r; o5 e. i& i- u. Z4 J- b6 e2 Y7 t
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    + _  I% T, M0 I8 o{
    0 _* {0 E- N# |/ I* n        comp temp, xtimesy;
    . ?! G( P- X9 N5 _0 |8 Y& ^" `: a- }        xtimesy.re = 0;
    2 m& ]: H4 K9 }: r- T: L' y        xtimesy.im = 0;
    7 C. z; A* M7 j; l- F        int j0 = lenB - 1;& c8 S+ `: T1 E. F% R% u
            int    i, j, i1, reali;
    , s3 v8 F, b( O4 ]0 s        if (lenA % 2 == 1)
    , |6 |+ `  E2 R. p# v" L  a                reali = lenA + 1;
    + f1 t* Q# x7 }        else
    " b; K5 K1 b, ?7 F                reali = lenA;
    : ]; j1 E( e. b0 U& ]9 V, x1 a" G' \        reali /= 2;; o% P& ]0 v& T+ {/ j/ K+ O8 Z
    ' T" @$ p" P2 H8 ~- H' U0 H
            int nconv = reali + lenB;
    1 h8 e5 w" D( U1 H# ]        //#pragma omp parallel for
    8 C* k/ j  s5 T2 i6 d; P        for (i = reali; i < nconv; i++)
    ) @) P; l- J. g7 b4 n& q- h        {
    % v7 x0 D$ O9 ~- u' A9 @                temp.re = 0;! N6 w" c, g3 _3 ^
                    temp.im = 0;/ h5 ]/ r1 b$ Y! b0 W
                    i1 = i;; \% S( g! S: x6 W
                    for (j = j0; j >= 0; j--)
    6 E/ \* K; L/ x& J, `4 p                {3 x5 S) P" X. k6 J+ P: `# b9 {. W
                            /* floating date operation */1 q. L& j. I6 Q
                    }
    " K" S6 m( O* z6 |
            }' b. A/ z6 ?# ?3 H; {6 x! q
    }
    : ^9 g! P, n; J: z+ i! E
    9 B6 w5 ~5 V' d. \6 `xcorr函数代码如上,comp是复数struct, 做过长度为11、19两个矢量的测试,和octave结果完全一样: d8 ^0 f; e8 l) ]
    ; r) F' ^. z( Q, m2 |9 x
    红色部分是内循环,现在其内部操作都comment out 了, j0大概是 6000。$ K/ n% j( y5 t
    现在call xcorr 100次,耗时78s.
      N! ]8 a8 A1 V5 }# w' L' K0 }' H# L, `
    如果把红色部分内循环本身完全comment out, call xcorr 1000次,耗时 <1s. 0 ]" h% [( j* [, F
    5 h& j1 f: I% E3 |
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    怒
    2025-9-22 22:19
  • 签到天数: 1183 天

    [LV.10]大乘

    6#
     楼主| 发表于 2022-9-25 00:17:17 | 只看该作者
    风雨无阻 发表于 2022-9-24 23:33' X, N  q* ^, S) h6 \
    Maybe Debug mode?

      \9 Q. Y, L1 H5 V& g6 O# r, {6 B* Z: P) o6 O) y' X9 Z7 K
    不应该,看我上面的回复。3 W6 W7 k6 F+ G$ h

    1 N4 g+ @0 V  h8 n我更怀疑是 VS 社区版的问题
    回复 支持 反对

    使用道具 举报

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

    [LV.Master]无

    7#
    发表于 2022-9-25 00:20:10 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 00:24 编辑
    9 v/ }! V* q% u7 M
    雷达 发表于 2022-9-24 23:547 q# D! I1 W7 `$ ]3 A/ @
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    " K6 A* `" u, R: H. E{/ u# d9 B: p$ M+ J8 Z2 v7 D
            comp temp, xtimesy;
    2 T- I/ P* ~* J, Z

    : Q' F! b8 h+ v8 u" k: X这个不是这么比的吧。。。
    ! i& J$ S! X! s. N, |% r! a  Z
    ) U! v! K! d' x; ^; V您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    ! Q: \( ]. U! w$ g3 ?& L; a- S2 B4 U8 ?( \# T% f# M) 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 编辑
    , f) l9 U$ U0 f" c" [2 y
    数值分析 发表于 2022-9-25 00:20
    9 r* S* X* J0 w% `$ z; V) `这个不是这么比的吧。。。. s/ ~0 H7 R: b( L

    # ?6 S0 o6 I6 z+ N' B0 K, F您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。

    + e3 I  D0 w( K/ P% A3 N: {
    % [. a" Y2 k* h9 m) i$ w有道理。
    ' ^6 d7 U! t" v0 `1 m  \0 |所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,记得 numeric 库里有算向量内积的,我回头试试。
    0 X9 d5 J: J$ b
    ; `1 L% \8 G& O# H( v  W% k& g- g1 a我先尝试尽量用标准库,一个小程序,不想搞得太复杂。多谢了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    9#
    发表于 2022-9-25 01:27:53 | 只看该作者
    雷达 发表于 2022-9-25 00:46% H4 R  {' p; l; c
    有道理。8 e6 s; b/ H1 ^  D0 E
    所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,这大 ...

    % \5 C% Q5 E+ e0 G1 I+ `0 y你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子,把循环本身翻译成机器指令loop或dec/jnz,两者速度上会差很多
    4 ?# g5 O9 N1 F5 W( {; R" WWhy is the loop instruction slow? Couldn't Intel have implemented it efficiently?
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    10#
    发表于 2022-9-25 01:48:51 | 只看该作者
    数值分析 发表于 2022-9-25 00:20
    ; [8 W9 U1 f5 j4 \8 F5 P这个不是这么比的吧。。。
    9 W+ U- H2 V1 i3 V4 V2 ~8 C5 C( P9 h  w% G) z8 f
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    而加上内循环,光jmp和dec指令就至少多执行了6000个

    " T- e5 }7 ^  N9 i' a
    8 ~0 n% s$ K$ Y4 C# h- g现在的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 编辑 5 \9 Y& b1 @6 b. a
    沉宝 发表于 2022-9-25 01:486 y4 h8 E! s; u. V" x
    现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果 ...

    & x) r+ |/ F& Q( Y
    . y4 n+ L4 x% S4 B/ n& O; s( E是的,兄台说的对。
    ' `/ H; ?6 ?+ e/ I+ O2 D) `* U7 C, g. Y
    其实我想说的是 真正数值计算部分和代码中其他不直接计算的overhead的比值这个事儿。( V) w! ]/ `& X7 b4 F6 ]
    . L  |9 \( Y/ J9 M
    雷达兄构造测试用例的时候,屏蔽掉了所有计算的部分,使得剩下的都是overhead,这样run time比较的结果就显得好像不合理了。如果把计算加回去,计算部分的run time会dominate,结果就不那么离谱了。因为不好说,所以用指令数对比的方式试图直观地说明这一点。
    & p0 G6 l& D, k  j, L
    2 Z# x; r' u! F% s/ Z1 b! `$ X1 w比如说,如果有计算,那么跑六千个循环相对于计算应该用不了多少时间。但是如果一边是什么都不做,另一边是六千个循环,那六千个循环比什么都不做慢几十倍了,就不是那么不合理了。5 B5 F- C3 @2 ?+ h$ [$ q! k7 p
    1 G4 E# Q6 |5 U1 Z
    当然也有可能像兄台说的,是优化参数的问题,但我觉得更多地是测试用例设计的不合理。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    怒
    2025-9-22 22:19
  • 签到天数: 1183 天

    [LV.10]大乘

    12#
     楼主| 发表于 2022-9-25 04:47:43 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 04:49 编辑 , u9 o9 ~( x2 H* v' x9 n
    沉宝 发表于 2022-9-25 01:278 _, y. f  H- [. s
    你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子 ...
    * i+ W- d- ^. P' g! {  Y0 N+ P
    . j4 R) P" K+ ?; Z, V1 L  d$ l+ V
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差一倍,我上面这个差的太多了。
    $ {2 o; f, l  C7 F" `) _% r; R& |' G* x, ]5 {; A
    我已经完全懵了。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    13#
    发表于 2022-9-25 05:51:23 | 只看该作者
    雷达 发表于 2022-9-25 04:47. P. h& ~, C  y9 h# n9 `
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...
    4 V& J$ C7 y+ Y4 @1 g1 o; E
    时间差一倍的结果可以接受。
    & R3 d& z8 O# F4 {
    . ]9 l* l' a2 {; \你还是用profile工具看看吧。现在大家都主观瞎猜。
    回复 支持 反对

    使用道具 举报

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

    [LV.Master]无

    14#
    发表于 2022-9-25 14:58:59 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 15:38 编辑 . a$ W8 E/ U' J4 c
    雷达 发表于 2022-9-25 04:47
    : ^, U! t& S$ c/ X又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...
    7 O5 U+ ?. Z$ S+ S5 ^- @0 Q
    ) W; {5 F4 X' d2 u
    ' f1 q* W0 v: E/ R! g; |
    ( f; l; _7 s; e, ], e( n+ r
    能不能把这个也贴上来,看看和上一个有什么不同?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    怒
    2025-9-22 22:19
  • 签到天数: 1183 天

    [LV.10]大乘

    15#
     楼主| 发表于 2022-9-26 01:30:03 | 只看该作者
    本帖最后由 雷达 于 2022-9-27 01:17 编辑
    ) x% K" }, t1 g, O
    数值分析 发表于 2022-9-25 14:58
      {) W$ G; I! C* H/ M: w能不能把这个也贴上来,看看和上一个有什么不同?

    ( ?6 ^" i- w! @- z8 U理了理思路,重新做了一个测试。9 x6 d# _& H+ L: f7 M. k
    做了两个 vector 和 两个 float *, 都长 1000001 g% H1 b  J3 g, o4 g2 k
    外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.( [1 \" P) ]7 W& \
    1 l, u# \* f! @* L0 ]% D: \/ W2 c
    内循环试了4种方法,
    $ Z1 p& @9 ^% i0 n( D  l% i1. 直接调用 vector inner_product 247s + ?+ S* }/ B+ {/ k0 _
    2. vector 循环点乘累加 237s8 P4 U* I& r: n
    3. float * 循环点乘累加 204s/ d/ c3 j6 P" B9 u2 }. N
    4. 空循环 100000 次 202s
    - A$ v3 T: X! z, A- u. n
    . q; P* _. v, o7 C$ R不做内循环 200s" ?# ]( b, ?& B+ A, m8 y5 s1 q$ ]

    # W2 z0 f/ \# h' q* a% q* ^- h你昨天说的对,内循环本身占比是很小的,大头在其他处理。% N& m" \( b2 ?6 r8 E3 r
    另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
    : ?% }( q1 k4 T9 T2 j6 M) S
    ! D' T8 o7 O( |至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)0 o$ Z3 T* F3 l* v

    * P! ]$ c4 c) z  k  X8 K- J(为什么下面我贴的  b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成  jj 好了,原来 方括号里的 i 是斜体标志  LOL)' v6 ]9 q- _0 ]+ W! e# B- T
    8 |$ M# {" P/ E" J
            std::vector < float > vec1(N);
    2 W) f' X) y# Q6 @        std::vector < float > vec2(N);
    6 E$ G9 g! B# W6 h& O        float* b1 = new float[N];
    & I/ g) Y) t7 @' |        float* b2 = new float[N];1 E% g" \+ c" U3 t2 d* g: e7 ?
    0 y2 U+ I2 Y2 J: W9 S
            for (int j = 0; j < 6000; j++)
      d4 P5 _% T8 p. c        {5 `8 D+ x% z, O- W; c
                    std::generate(vec1.begin(), vec1.end(), []() {
    2 J1 ~& \8 R0 V1 n  c! Q% L1 c                        return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
    ) ~) ^' Y" F! v2 {0 |( S                        });  S, c$ k% ~# W! E2 g4 ~$ M! }1 K

    * u7 I$ s* U% T8 ^. g( d) b: L& ~                std::generate(vec2.begin(), vec2.end(), []() {
      V$ [3 i, Z0 |/ }4 [                        return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
    $ V6 ], U/ B& o8 V                        });
    + d0 C& X" i6 ]0 u! }9 T3 |# d9 _5 M% A  ~$ J" `
                    for (size_t jj = 0; jj < vec1.size(); jj++)* ]. y% o; Y' h# o3 M3 B" w
                    {$ R* l! i( |" C5 r* E* K. p" E
                            b1[jj] = vec1[jj];
    , ?( r% P: V$ E& [+ O* w                }
    1 P5 U; W6 p0 T8 H1 R0 {! T' n" q, @* \, D2 P7 }3 ^# @
                    for (size_t jj = 0; jj < vec2.size(); jj++)
    ; I3 X8 c# }( [8 q. R( i                {5 f% J( n+ ^0 A0 K& t
                            b2[jj] = vec2[jj];
    & U. o5 H- |2 |& j& @! Y- G' C                }
    ) O$ N- }# n# U) N; p2 Q4 Z9 l& D/ x. k; D* h4 e
                    //Method - 1  N=100000 247s  
      |) ]7 x7 r& Z7 }                //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);# `4 P5 R: W: ]% h6 I# X$ o
                                    * J# m- s5 a4 o" E
                    //Method - 2  N=100000  237s0 {1 |& l% F# J7 L# [9 ~
                    /*
    3 @* @3 U  ^. L0 }3 V& V                for (int jj = 0; jj < N ; jj++)+ _1 d4 @0 g# {3 A) A4 v
                    {
    ! Q( Z1 G& y% q1 Q                        fresult += vec1[jj] * vec2[jj];
    3 V2 {7 h; ^! h" w& w7 R; H2 f                }
    # U. y1 b: Q& n+ C5 f" e9 O8 j                */2 m( D$ [9 M2 K1 `  v
                                    ; ?% W5 {1 A2 |' r, u0 q3 [/ l# J
                    //Method - 3  N=100000 204s8 e- `) e1 Z0 d/ z
                    /*
    5 x4 {% z4 U: I: y9 ^% f8 M# Q; t! G                for (int jj = 0; jj < N; jj++)
    . n, E7 t9 J# `                {
    0 {* g3 M# R* n( B. \( W( o: A                        fresult += b1[jj] * b2[jj];  p9 |0 ^) X: A0 v
                    }" j# E' L/ o* t7 k2 ?1 [' m0 |
                    */
    - ]% ]0 s; O0 @- w. P7 V  ]8 |8 x( a5 s0 ^; D( U% U: }
                    //Method - 4   202s
    % v2 L: w4 G8 C- I  M8 F                /*3 N* L/ t# |8 ^) |' l& f. ~
                    for (int jj = 0; jj < N; jj++)
    & Q, O# \* s; i" m3 }                {" `0 ]" f6 v! f
                            
    ' j+ o3 _( H/ f* v                }5 I# W: d5 A9 X3 R1 o. {# S
                    */
    ! o' r# w% E0 K                //comment out all methods, N=100000  202s               
    & x7 w% k2 [: P* y  X! X( e8 V        }- ^0 I2 T. C; o) O, y

    9 n( Y0 [2 j5 o) S        delete []b1;
    8 ?  I5 j2 z( K7 w& P        delete []b2;

    1 d8 Y0 Y( S4 C; H7 A
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    16#
    发表于 2022-9-27 00:15:38 | 只看该作者
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?5 y) H$ Z$ ~/ ^  j' o2 ?$ e4 X

    ! q  ?) S' }3 C8 v/ X; i% h  T你第二个试验里面的j在循环里面又重新定义了啊,你确定真的跑了6000次?
    8 U; Z9 E6 X. V1 X( e/ [
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    怒
    2025-9-22 22:19
  • 签到天数: 1183 天

    [LV.10]大乘

    17#
     楼主| 发表于 2022-9-27 01:16:03 | 只看该作者
    机器猫 发表于 2022-9-27 00:15
    $ }% t1 r+ A* A) ]3 x, j瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?/ ?5 ~8 t9 H5 t6 s  O, A
    , D9 h# D* L0 T$ M, j0 r
    你第二个试验里面的j在循环里面又重新定义 ...
    / l6 c2 i2 e3 k0 P1 V0 ~
    内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL; o" {0 p: Q& S9 x$ I

    , _0 @' c! D" q不和它较劲了,瞎耽误工夫,我已经转到 ubuntu, 也准备顺便试试 avx2 向量化。
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    18#
    发表于 2022-9-27 02:06:58 | 只看该作者
    雷达 发表于 2022-9-27 01:16
    ' ]/ y3 K6 p0 A内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL
    7 o8 g1 b! v6 h# M, X5 m8 \+ J  a- \
    ) ]( t9 D9 g1 v$ e1 w4 M不和它 ...

    , F5 L) c4 D& z+ g/ _& r1 M0 H: V/ p- y( f7 A: S! F+ K- {
    不过可以试试我说的register变量。前一个试验j是混在一堆其它变量里一起定义的,很有可能是在stack上,这样内存读写会更多,要是再碰上每次都需要加载cache就更慢了。
    0 C. j. _% y8 z0 n# g: L( x- `后面一个是在循环那里定义的,说不定编译器就把它优化成register变量了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

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

    使用道具 举报

    该用户从未签到

    20#
    发表于 2022-9-27 20:29:50 | 只看该作者
    雷达 发表于 2022-9-24 23:54
    - c9 E: r% S" {" Ivoid xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB). K. l5 l" r. u" R* S/ X( K) \' g$ q
    {
    ) q2 {: D' B  c: ?        comp temp, xtimesy;

    # N8 u6 ]: w/ }这个code里面如果Openmp没有被注释掉的话,那么temp那个变量应该是定义在循环里面,否则线程之间会存在争夺写入那个temp的风险。$ g5 Q$ j! S! l3 s0 z# K
    内层for循环如果没有内部操作的话,编译时应该被优化掉了,和你完全注册掉整个循环是一回事。可能你的编译设置没有打开优化?
    6 \- D& g/ ~9 M" ?VS社区版没有问题,我工作用的就是社区版,设置正常的话不会比商业版差。以前游说头头用Intel Compiler,他说不想花钱,而且差不了多少,就一直用到现在。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2026-9-29 02:12 , Processed in 0.075389 second(s), 20 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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