设为首页收藏本站

爱吱声

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

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2022-9-24 22:54:26 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
    C++ 比 Octave 慢好多,怎么破?4 s' Y' v/ Z# R3 J- a' L# w
    # t1 l1 [! [: l$ P2 i
    自相关两层循环,内层循环涉及浮点数计算,试验了一下把内层循环内部全都 comment out 只留个壳子,  但空的内层循环本身就把速度拉下来了,看来问题并不在浮点计算。
    # T3 a7 t" L- }0 W" k0 K1 Y: b/ u* K; j3 v+ Q: p8 j' H0 O
    速度优化问题真的很有意思啊。$ j$ V# w  G! P2 s

    : w" `" \0 y5 P+ J% r3 \- G7 Q欢迎大家继续讨论

    评分

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

    查看全部评分

  • TA的每日心情
    开心
    4 天前
  • 签到天数: 1954 天

    [LV.Master]无

    沙发
    发表于 2022-9-24 23:04:16 | 只看该作者
    拉下来?拉多少?8 o7 C. @, _" @9 a7 ^- |
    把代码贴上来看看?+ n7 I2 u; x1 l, B
    / }3 x# \4 ^8 B) k. Z4 u
    难道分支预测不准破坏流水线执行?不该啊。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    板凳
    发表于 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 编辑 1 Z- B% `4 t, V. s6 A+ t
    数值分析 发表于 2022-9-24 23:04
    ) {$ ~  U$ x- H  Q! \拉下来?拉多少?
    : Q& G" E9 }1 I  p2 D: d把代码贴上来看看?
    8 E7 f7 f8 E7 w9 O5 @
      s0 C. N6 p1 K
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    ' U+ W# _- L* e6 N8 X* P{) \/ G4 d7 Z2 V, J1 V0 X6 s0 K
            comp temp, xtimesy;* |/ J& Z" W6 g8 e
            xtimesy.re = 0;
    2 W5 w) r1 X3 E- r        xtimesy.im = 0;
    ) V* q' Z3 j9 L- `/ C( G7 O7 k        int j0 = lenB - 1;9 F- m$ g) L4 R+ `1 C
            int    i, j, i1, reali;
    9 f) l: A; l0 L% L5 h        if (lenA % 2 == 1)
    $ x8 J) k, j9 z! G" n' V! Y                reali = lenA + 1;0 H' R/ y& O, e" A' C. Y
            else, J4 H: p7 f1 g, h
                    reali = lenA;
    8 ^6 k* C- u+ Y! }: W        reali /= 2;; q6 y- q  L! x5 R  y" }1 h9 {
    . z2 c/ k: q: p1 y, Q
            int nconv = reali + lenB;
    / j6 t4 q, z! Q4 n, _$ @9 R7 u, R        //#pragma omp parallel for  P0 X) w/ G" R$ \# S) ^
            for (i = reali; i < nconv; i++)' n3 m5 ~8 ]9 J6 N
            {
    . l% G' j* L4 {9 P% ]                temp.re = 0;* {/ t; Z4 c; x
                    temp.im = 0;
    6 u) r" N% X  ?; _: Y7 J* ?. N; S                i1 = i;$ {$ O  _; V8 H+ x$ u% y
                    for (j = j0; j >= 0; j--)
    - {# x# I2 C+ B% L3 B6 v                {6 M, n, u" U7 }# z4 Y$ N  J4 w
                            /* floating date operation */8 r6 T- X7 n) e- u1 C! h
                    }

    & ^! K" F+ P- `6 A8 e. [        }
    1 [$ K" _* m9 P4 ]}
    , {) i# `  n* _: J/ h; D; c% ^( D0 t; M- }" P3 Y9 t6 S# H5 R
    xcorr函数代码如上,comp是复数struct, 做过长度为11、19两个矢量的测试,和octave结果完全一样5 [  e- ?/ @/ y

    * @3 X2 }1 J4 ^红色部分是内循环,现在其内部操作都comment out 了, j0大概是 6000。- }% b( }9 i* l4 p) P5 c
    现在call xcorr 100次,耗时78s.
    7 f5 E( y- C& t, w) h8 L; E: [+ U  N2 N: ^! D/ l
    如果把红色部分内循环本身完全comment out, call xcorr 1000次,耗时 <1s. 1 `2 Z* v$ U6 o+ |; l3 n! O

    7 G/ q( f" U( _( g: Q0 {( ?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    6#
     楼主| 发表于 2022-9-25 00:17:17 | 只看该作者
    风雨无阻 发表于 2022-9-24 23:33
    + V2 ~1 D$ y+ W7 O/ xMaybe Debug mode?
    6 F1 a9 y* k/ ]" y: A
    3 ~8 |0 Z- d& L/ y% D' Y" P
    不应该,看我上面的回复。
    , v5 U, `' @6 T: }- k' W& v7 q5 O* |0 N
    我更怀疑是 VS 社区版的问题
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    4 天前
  • 签到天数: 1954 天

    [LV.Master]无

    7#
    发表于 2022-9-25 00:20:10 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 00:24 编辑
    & L% }4 ?  A0 W# J' r3 O" R6 i
    雷达 发表于 2022-9-24 23:547 C, X$ b! h7 g& w3 _* m9 A
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    3 I' ~# i; |) O3 }{; S4 {; ]( E/ O8 X7 O1 {
            comp temp, xtimesy;
    9 V3 B0 N: @, P* j
    ' c, ]" G8 Y& ^# m+ n$ Z) k
    这个不是这么比的吧。。。6 v9 G; l2 A. [5 _  Z- f
    - X( F* Z/ `& Z* @5 z
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。" E8 K% c* b1 c, ~) o
    ( S: h" _/ m) Z# N
    而加上内循环,光jmp和dec指令就至少多执行了6000个,慢个几十倍不是正常的么?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    8#
     楼主| 发表于 2022-9-25 00:46:56 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 01:09 编辑 2 p. _! h% `8 ?1 [( s% S# X; ^
    数值分析 发表于 2022-9-25 00:204 \, K( I3 y" l! m. n
    这个不是这么比的吧。。。4 X7 r' ?$ M; W- S4 n* H5 a/ Z3 _

    2 j3 A3 t/ x/ J5 h您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。

      u: E4 N: e$ u( W* L3 \! W  Y- W2 D$ }, b4 @/ g4 O8 Y
    有道理。/ T# i5 }+ C) L0 _* B- g0 G
    所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,记得 numeric 库里有算向量内积的,我回头试试。& q  r1 {! ]2 o4 u: K3 T: \

    7 R5 A8 X  o% h- v我先尝试尽量用标准库,一个小程序,不想搞得太复杂。多谢了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    9#
    发表于 2022-9-25 01:27:53 | 只看该作者
    雷达 发表于 2022-9-25 00:46' R7 c- w2 D! a+ O9 m' x( V7 X! A8 s
    有道理。
    8 U1 \2 ?( n) C) D7 P6 D所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,这大 ...

    / S* R4 f: }! ?0 K) [, Z( {: G5 J你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子,把循环本身翻译成机器指令loop或dec/jnz,两者速度上会差很多
    1 p* v1 S; P1 q8 vWhy is the loop instruction slow? Couldn't Intel have implemented it efficiently?
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    10#
    发表于 2022-9-25 01:48:51 | 只看该作者
    数值分析 发表于 2022-9-25 00:20
    4 i9 X0 n# a: x这个不是这么比的吧。。。& ~, K( ^5 g8 \% I' }9 f

    1 ?7 s3 y1 E( S您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    而加上内循环,光jmp和dec指令就至少多执行了6000个

    8 {* e2 W+ J) d$ ]  p$ }+ h+ j8 {4 j  a% s2 h1 q
    现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果循环这样跑,花不了多少时间。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    4 天前
  • 签到天数: 1954 天

    [LV.Master]无

    11#
    发表于 2022-9-25 02:06:44 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 02:16 编辑
    / r& H6 O' g! }7 S- P( _% u
    沉宝 发表于 2022-9-25 01:482 W8 O+ R* z0 G% s6 e) C
    现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果 ...

    9 W5 T; ^3 j, T2 R- s% U4 J1 `; W. H' J" x. P' W
    是的,兄台说的对。
    * N3 _/ k& m$ c+ B' V" u# E6 ?* t, }! X+ H" v8 @
    其实我想说的是 真正数值计算部分和代码中其他不直接计算的overhead的比值这个事儿。3 C8 h; c" s, W6 s3 M
    + w% u$ Z: U! O& ]7 I! F
    雷达兄构造测试用例的时候,屏蔽掉了所有计算的部分,使得剩下的都是overhead,这样run time比较的结果就显得好像不合理了。如果把计算加回去,计算部分的run time会dominate,结果就不那么离谱了。因为不好说,所以用指令数对比的方式试图直观地说明这一点。
    / {$ F& p+ w9 S6 c7 f* t+ |
    3 `) o, i' J- S6 s- p; n, f) B比如说,如果有计算,那么跑六千个循环相对于计算应该用不了多少时间。但是如果一边是什么都不做,另一边是六千个循环,那六千个循环比什么都不做慢几十倍了,就不是那么不合理了。
    & U% a% L8 k" ], G5 d% P1 a6 r4 y$ N" A* h- |- a
    当然也有可能像兄台说的,是优化参数的问题,但我觉得更多地是测试用例设计的不合理。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    12#
     楼主| 发表于 2022-9-25 04:47:43 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 04:49 编辑 : t+ O1 x5 k5 G1 E; u' D' B) R1 s8 J
    沉宝 发表于 2022-9-25 01:27
    8 }9 F: |2 R6 \7 b你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子 ...
    0 m' Q& K& ?: x  B
    ( @5 m2 O) k+ s4 V, E9 |# v- e
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差一倍,我上面这个差的太多了。/ \2 P" v( Z% y- {# i

    - K5 E1 O7 F! g. Q! t$ ^我已经完全懵了。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    13#
    发表于 2022-9-25 05:51:23 | 只看该作者
    雷达 发表于 2022-9-25 04:473 e' u8 Z: x, A9 |, r
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...
    $ @8 b: x# ~) M* k( F
    时间差一倍的结果可以接受。
    : Q- u! P# o. r! K( f3 ~# L, K- s$ S$ ?6 [$ g4 G: v
    你还是用profile工具看看吧。现在大家都主观瞎猜。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    4 天前
  • 签到天数: 1954 天

    [LV.Master]无

    14#
    发表于 2022-9-25 14:58:59 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 15:38 编辑 ( ^2 P$ j; G! L( Q9 S! T9 u9 ?# @
    雷达 发表于 2022-9-25 04:47  ]# l* V$ r( \5 H: e
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...

    ' T$ x6 `. A% S, l7 @8 ]- _9 b! X5 f5 R3 e9 V

    / Z3 H8 l7 J: P5 Q! e, `6 N8 o
    6 ?  I# `- c7 K) J能不能把这个也贴上来,看看和上一个有什么不同?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    15#
     楼主| 发表于 2022-9-26 01:30:03 | 只看该作者
    本帖最后由 雷达 于 2022-9-27 01:17 编辑
    ! T4 B+ S& n) T5 n/ X  [! Z5 q
    数值分析 发表于 2022-9-25 14:58
    ) n% v2 [; h& j6 h$ W( e能不能把这个也贴上来,看看和上一个有什么不同?

    " A1 Y; O( \/ {: k理了理思路,重新做了一个测试。; s$ K6 W  }3 {7 R+ `. m
    做了两个 vector 和 两个 float *, 都长 100000
    . ]) {9 y4 _8 @8 f外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
    ! y3 q& Q9 U- a2 y" v! y( Y; u! @* l; f% K6 y( ^
    内循环试了4种方法,
    3 V( d$ P& h3 r) }- K: t1. 直接调用 vector inner_product 247s
    % e9 \: Z! R2 ]* J  b+ r1 |0 B2. vector 循环点乘累加 237s
    1 E/ d5 S3 F, _# o3 Y, a3. float * 循环点乘累加 204s
    6 d- T$ k- `# X7 D, u" l4. 空循环 100000 次 202s
    & @% h- H' ~% K; J: y& @, W5 ?, t# e: J0 J( P+ q. s
    不做内循环 200s
    2 U* i& K1 A  L; A( L0 L! ^
    ! W5 {; R/ Z' h; U你昨天说的对,内循环本身占比是很小的,大头在其他处理。
    5 p4 p. o7 T/ _" q另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。0 Z! [  P  Q( P9 l/ u9 ?

    $ e+ x' m; }; i! M, Q至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)  N. e2 a4 v/ X
    5 G. X8 n, B7 R4 ^8 q% e
    (为什么下面我贴的  b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成  jj 好了,原来 方括号里的 i 是斜体标志  LOL)8 w  i3 |3 _9 }; ]

    ( Y1 j2 B9 }% D9 y9 T
            std::vector < float > vec1(N);/ B8 F3 s# T& y
            std::vector < float > vec2(N);- U) C: q0 w3 Z) f* b8 C
            float* b1 = new float[N];
    0 t  a% f( u3 I2 X7 d$ x7 S        float* b2 = new float[N];
    ; o6 c- f0 E1 q. @, P7 F/ S9 h0 ~, Z, r1 Z
            for (int j = 0; j < 6000; j++)) O7 L$ X9 {* n8 O0 D
            {* V- W4 p3 b1 b4 f3 g4 ]
                    std::generate(vec1.begin(), vec1.end(), []() {
    " W1 [7 i( Q/ v5 \* H2 Y                        return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;% s0 S, L( \) i; U* [
                            });
    ' R/ K) Z) E- p5 A; `* K/ W8 ^4 Y: b7 c
                    std::generate(vec2.begin(), vec2.end(), []() {( ]5 D7 N. g, @) {, T6 a1 E, u9 L
                            return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
    ( ]; K! s- o) L1 Z  v8 ^                        });
    ' S/ y) |- [+ u! o2 B$ `
      c" R; e. y0 q% N+ A. y                for (size_t jj = 0; jj < vec1.size(); jj++); s% ~3 [( \9 [8 k& u/ k
                    {
    - ~; g# k' ~: L) |2 z                        b1[jj] = vec1[jj];8 b; y* f" R9 g& O. A4 ^4 ]
                    }- D, F3 P% ~: @# w/ A
    1 e8 V6 F2 k& h  Q" g& w
                    for (size_t jj = 0; jj < vec2.size(); jj++)$ s+ X; j9 B7 q/ ?! w% C
                    {
    : Y5 t. G9 Z% X% v5 w9 k                        b2[jj] = vec2[jj];
    * o7 G! t( O  r* h                }
    / O8 z) G6 v, O
    % o% W) K* [' v0 _, N: J                //Method - 1  N=100000 247s  
    ( I) }" f3 R( @1 A2 i3 g                //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
    7 a$ @: q6 ^6 J  x, p4 b                                7 v$ y9 a7 _2 H
                    //Method - 2  N=100000  237s6 o' M& x' O* d
                    /*
    % l- i! z2 m. W% g- V, C                for (int jj = 0; jj < N ; jj++)
    " z* _  u! j  ]$ {% V                {7 Q8 {7 @' ]: P! _2 z/ c1 }
                            fresult += vec1[jj] * vec2[jj];
    . f4 v& l3 R/ _                }9 ]1 s. v! d- V6 F! ?! _
                    */
    0 k: R# l: Y! m: q1 s                                # @/ ]% Z: b' y
                    //Method - 3  N=100000 204s
    , r3 h5 m3 J2 U6 B4 N9 C+ X                /*
    2 _7 j7 R$ e2 V: j9 g: Z4 F                for (int jj = 0; jj < N; jj++)
    ' v& }" d/ S. f! c8 L" ~                {7 e' z. |* T( {& A, r1 m
                            fresult += b1[jj] * b2[jj];
    $ s6 @; d% ?! A7 t: A: u                }
    / u) ?& m+ o% `. L                */
    0 z. Z$ I9 K; L6 A' Z7 X/ F
    : b5 l0 F) y( b                //Method - 4   202s- I; [7 P, X2 l; z9 n+ @- G* B
                    /*
    ; ^' v* _3 ^* X5 J" {( n% N                for (int jj = 0; jj < N; jj++)# K: y8 @& t, d% N1 y( r2 f" b
                    {
    0 H5 i# G5 Z4 ^# a$ q/ Q                        + E' K) Y3 F. v8 R, E5 M8 Z1 c
                    }9 J$ G, U! r! C  R- |+ N) M: J1 ~
                    */$ `& P# N. @. V' r: ]
                    //comment out all methods, N=100000  202s                ; ?" q' @; y* y- w
            }$ o5 E) N: _' {' z

    ( T: Q; W: t" o' J5 {        delete []b1;& H% w7 a( P* _7 n* }) Y0 \- `
            delete []b2;
    7 w# w# W1 b4 j3 Q+ k# i
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    16#
    发表于 2022-9-27 00:15:38 | 只看该作者
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?- o7 l- z. F2 T' ?0 f8 _: v9 R  d
    & t, N; [+ L9 l% X3 A
    你第二个试验里面的j在循环里面又重新定义了啊,你确定真的跑了6000次?* X8 F% |7 |% A- Z
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    17#
     楼主| 发表于 2022-9-27 01:16:03 | 只看该作者
    机器猫 发表于 2022-9-27 00:15
    + O- x3 [6 N2 [0 a$ K" X+ k瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?8 w( \* s/ K4 n4 Z8 y! f

    % k# H. c$ {- b6 y- Q. I  f你第二个试验里面的j在循环里面又重新定义 ...
    , q8 c. S' i% G
    内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL% V+ a( e6 Q4 T* k6 ?
    . X2 m, t4 p' H
    不和它较劲了,瞎耽误工夫,我已经转到 ubuntu, 也准备顺便试试 avx2 向量化。
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    18#
    发表于 2022-9-27 02:06:58 | 只看该作者
    雷达 发表于 2022-9-27 01:16* T1 T/ Z" K' d) q) i) [6 O  L" d
    内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL
    2 E" ]+ d! \8 Q" D% d8 ]) G% G; v7 Z8 G& h; j0 S4 x3 Y# @
    不和它 ...
    # _" |, X+ J* I! ^

    ' [- Z" e: v$ e$ x" R8 b0 v不过可以试试我说的register变量。前一个试验j是混在一堆其它变量里一起定义的,很有可能是在stack上,这样内存读写会更多,要是再碰上每次都需要加载cache就更慢了。
    * n9 J" ]! a: v& g2 D" |后面一个是在循环那里定义的,说不定编译器就把它优化成register变量了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

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

    使用道具 举报

    该用户从未签到

    20#
    发表于 2022-9-27 20:29:50 | 只看该作者
    雷达 发表于 2022-9-24 23:54
    " h; S1 L9 x5 x& l1 C; Avoid xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)1 T( f2 U) g. ]$ |
    {0 q/ N4 X) K8 O1 u  N1 j  ]
            comp temp, xtimesy;
    1 z- |: k3 b$ g2 P1 J# Q1 G
    这个code里面如果Openmp没有被注释掉的话,那么temp那个变量应该是定义在循环里面,否则线程之间会存在争夺写入那个temp的风险。* C- ?0 s* _5 C  E6 ^
    内层for循环如果没有内部操作的话,编译时应该被优化掉了,和你完全注册掉整个循环是一回事。可能你的编译设置没有打开优化?% c# l& s6 I# W$ r0 @; L3 z& B' `
    VS社区版没有问题,我工作用的就是社区版,设置正常的话不会比商业版差。以前游说头头用Intel Compiler,他说不想花钱,而且差不了多少,就一直用到现在。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2025-12-30 04:40 , Processed in 0.039883 second(s), 19 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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