设为首页收藏本站

爱吱声

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

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2022-9-24 22:54:26 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
    C++ 比 Octave 慢好多,怎么破?) n# X: M/ ?' F. Y+ X
    ; _" |0 w3 l7 F# \
    自相关两层循环,内层循环涉及浮点数计算,试验了一下把内层循环内部全都 comment out 只留个壳子,  但空的内层循环本身就把速度拉下来了,看来问题并不在浮点计算。
    # n9 V) Y4 H( E7 Z. ~: [- E9 J  c* @3 \8 _8 f/ a# S  @! Q
    速度优化问题真的很有意思啊。, n4 E) _$ L  R7 h

    , Y3 [$ X, Y- ~) z) H欢迎大家继续讨论

    评分

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

    查看全部评分

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

    [LV.Master]无

    沙发
    发表于 2022-9-24 23:04:16 | 只看该作者
    拉下来?拉多少?
    / e; b# B# w; W8 c' s把代码贴上来看看?; Z6 `& @. P- g9 p5 j

    ( m( g/ N1 j% e1 r6 y难道分支预测不准破坏流水线执行?不该啊。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    板凳
    发表于 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 编辑
    " P: D# j& p* ?/ U# i
    数值分析 发表于 2022-9-24 23:04
    ; `. W: A6 |. [2 ]9 F" @0 q7 ?拉下来?拉多少?
    ! _- S* t9 v9 U  a把代码贴上来看看?
    / {- R0 e0 ~* q7 ^, t
    6 c5 S! u( f( E+ n, x+ \
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)& Q1 A8 S3 _8 H8 {4 R
    {+ w( i( t, x% y* X8 g8 V! [$ {
            comp temp, xtimesy;' o  E8 K" m" j4 T/ I3 S) a
            xtimesy.re = 0;# [( w# B* H$ o: s* s3 Y
            xtimesy.im = 0;
    * B& T/ Q- x9 K/ [( d7 J        int j0 = lenB - 1;+ d9 l6 ?& c" g3 y$ x6 d
            int    i, j, i1, reali;
    + ?5 V7 t" e5 A2 Q0 A- u        if (lenA % 2 == 1)* Z. i  o' L) I2 M: D9 n$ v
                    reali = lenA + 1;
    : V1 g3 ]/ d/ j. z- ?) D8 H5 }$ [        else; l: a5 {* e# B1 t) T/ }
                    reali = lenA;3 N+ u; H) P3 w: F+ f' e
            reali /= 2;  w9 P) W/ O: O- S+ U5 z
    & [# c/ Q. k1 @1 f# }7 \
            int nconv = reali + lenB;, C6 B  e6 C: i4 i
            //#pragma omp parallel for# A5 b% k5 r3 X9 L) i2 ?
            for (i = reali; i < nconv; i++)4 b4 D1 D# V& m4 ~
            {* T$ }5 N9 m2 z) f; ], q- |7 L, Z
                    temp.re = 0;
    2 d7 }! T7 Y1 f9 d  `/ Q5 T/ r                temp.im = 0;) {- Z- j3 l. m/ S0 g2 x6 f: N
                    i1 = i;
    2 L7 M, B( w$ a6 R) [                for (j = j0; j >= 0; j--)
    / H$ z  `! ^& Z, h' b& Y/ j1 O- D                {( }1 b' k  p4 @8 T
                            /* floating date operation */4 w' q; H2 O/ N% w
                    }
    & x' e- d/ E0 U
            }
    - A2 W: F* t. O5 A0 H}8 Y1 Q9 m" B% P# V

    ' E5 C; B: L" X0 l: ~- ]( y$ Rxcorr函数代码如上,comp是复数struct, 做过长度为11、19两个矢量的测试,和octave结果完全一样
    : y7 {7 U7 S/ C: k1 E6 G7 U/ l. R4 k% N- W- [1 S* F" h2 ^
    红色部分是内循环,现在其内部操作都comment out 了, j0大概是 6000。
    & M+ S( u/ q8 i5 @3 P现在call xcorr 100次,耗时78s.
    4 n$ Y; n* [% g9 G0 f& o3 B, M9 I& F$ |
    如果把红色部分内循环本身完全comment out, call xcorr 1000次,耗时 <1s.
    / R( ]/ ^' a6 E: D% V8 E. a! N: [# r+ K4 D
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    6#
     楼主| 发表于 2022-9-25 00:17:17 | 只看该作者
    风雨无阻 发表于 2022-9-24 23:33
    6 h+ R1 L, y0 [! R  Q  QMaybe Debug mode?

    ! G, W6 T) K5 N# ]- n/ E5 G  K8 ~! A' a$ [0 }2 u5 i3 n+ u5 Y
    不应该,看我上面的回复。
    ( m: z' n; v, j- |) P
    9 V6 u2 Q) X( D% [' u: l8 ?我更怀疑是 VS 社区版的问题
    回复 支持 反对

    使用道具 举报

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

    [LV.Master]无

    7#
    发表于 2022-9-25 00:20:10 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 00:24 编辑 . e; M. a+ c4 q. ~! I8 y7 @  l
    雷达 发表于 2022-9-24 23:54
    " @7 d" A/ r5 Bvoid xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    3 S* m; u( ~6 u# ^; G{
    8 W0 s, W( K9 N6 j* {0 U7 N6 C        comp temp, xtimesy;
    : }& Y9 A% r* L2 e% N

      x7 Q) {6 W* {) p. y% w这个不是这么比的吧。。。' T) \6 S7 f0 [+ R# d
    , z9 E: G3 p7 l( s* {
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    . H' X2 d* ^" S+ P& c; f0 ~
    ' w% N! d7 Q) h8 k& K( G9 Y而加上内循环,光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 \% N3 B+ Y- |* i
    数值分析 发表于 2022-9-25 00:205 l) R) X6 ~. v  j
    这个不是这么比的吧。。。7 e' c2 p3 w/ V

    & ^; b  ]( E9 \$ [8 O) e- n您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    ( J  t2 x1 C& i; d; l

    + M2 |& j5 s7 v0 v2 v有道理。) T+ |. m3 r& a; \( O# X! ~* U% m8 g
    所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,记得 numeric 库里有算向量内积的,我回头试试。
    1 w2 u9 o" t% y  a. q9 W: p0 T+ b4 D. n# |7 A: {2 N5 D: U( A
    我先尝试尽量用标准库,一个小程序,不想搞得太复杂。多谢了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    9#
    发表于 2022-9-25 01:27:53 | 只看该作者
    雷达 发表于 2022-9-25 00:46- J! O; G  G; H/ i- u& O1 _6 N
    有道理。
    ! e( `: L7 X+ l4 B( S0 d4 h% @5 ^所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,这大 ...
    0 B7 b& @. X( \' H1 M# i( \# F4 Q/ o
    你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子,把循环本身翻译成机器指令loop或dec/jnz,两者速度上会差很多) ~$ D- D  b0 H; L  N8 I8 i* E+ s
    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/ V9 |! e! J3 l, L# _
    这个不是这么比的吧。。。
    % q& o( i7 b# |5 C& T
    7 E. |/ _) o9 g4 ]2 w您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    而加上内循环,光jmp和dec指令就至少多执行了6000个
    , ]% V# W6 G8 M& h, u
    ' d7 {# ~* t3 X7 a% H
    现在的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+ G8 |* p
    沉宝 发表于 2022-9-25 01:48
    / x, p$ W% G9 o* {2 v现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果 ...

    # k4 C! |& C% o2 J
    # S" \8 x0 Z, h& g. W+ S4 S是的,兄台说的对。
    1 d0 p9 k. g# f
    ) j9 `( n# U3 o1 O其实我想说的是 真正数值计算部分和代码中其他不直接计算的overhead的比值这个事儿。
    ) f7 b9 h. B9 l/ Q: t3 i
    - k4 k  Q, }! H$ [  i& i雷达兄构造测试用例的时候,屏蔽掉了所有计算的部分,使得剩下的都是overhead,这样run time比较的结果就显得好像不合理了。如果把计算加回去,计算部分的run time会dominate,结果就不那么离谱了。因为不好说,所以用指令数对比的方式试图直观地说明这一点。. ~$ }) j  L" a" I/ h2 V2 r1 j; l

    # E6 {* h+ U  E/ r; X# }: v9 I比如说,如果有计算,那么跑六千个循环相对于计算应该用不了多少时间。但是如果一边是什么都不做,另一边是六千个循环,那六千个循环比什么都不做慢几十倍了,就不是那么不合理了。1 o( ~7 g: {' Z
    ) e' Y& E. a" K& z
    当然也有可能像兄台说的,是优化参数的问题,但我觉得更多地是测试用例设计的不合理。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    12#
     楼主| 发表于 2022-9-25 04:47:43 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 04:49 编辑 5 X7 D0 x4 j& s9 B
    沉宝 发表于 2022-9-25 01:27
    7 ^& u2 e+ h7 _你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子 ...
    2 [: f' \! j7 B3 ~

    5 D* a( W* a6 ^! p# K/ z# P! R又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差一倍,我上面这个差的太多了。. z# m* D3 m: F# j5 k: e' L8 {+ `$ @
    & ]. k' v/ Y6 X7 b9 _- f
    我已经完全懵了。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    13#
    发表于 2022-9-25 05:51:23 | 只看该作者
    雷达 发表于 2022-9-25 04:47+ O6 N' Z/ A& v, f, o, ~8 k  e
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...

    3 j" R, |- w( @时间差一倍的结果可以接受。
    3 L7 H0 G  p7 c; p
    - |9 W% K6 a; n# J9 K; m你还是用profile工具看看吧。现在大家都主观瞎猜。
    回复 支持 反对

    使用道具 举报

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

    [LV.Master]无

    14#
    发表于 2022-9-25 14:58:59 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 15:38 编辑
    0 m; W- |7 r. B" k" W
    雷达 发表于 2022-9-25 04:475 a) t/ m0 |5 w2 x+ D/ g
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...

    6 d3 ~# e0 |7 G" H9 o- A8 |) Z" p5 c8 K0 y( A( e0 }) E9 P1 N) N
    5 X& ^- E+ u; ?) y, [( [/ Z

    0 l: N% Q: Z* e& S0 u( Y3 a4 G能不能把这个也贴上来,看看和上一个有什么不同?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    15#
     楼主| 发表于 2022-9-26 01:30:03 | 只看该作者
    本帖最后由 雷达 于 2022-9-27 01:17 编辑
    7 Y: ^( n) U' \0 a8 B1 k  d
    数值分析 发表于 2022-9-25 14:58
    0 u- k# ~" J( i7 e+ _, X& I' A" n, P能不能把这个也贴上来,看看和上一个有什么不同?

    9 d8 u& o" p, L8 z- g& H理了理思路,重新做了一个测试。
    ) K1 n4 M3 I+ k$ j8 D6 M+ D% \做了两个 vector 和 两个 float *, 都长 100000
    # `! Q/ e  n4 g- Y外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.- z; W& \  l6 F3 x
    # i6 P1 {) y& @& Z  C+ I
    内循环试了4种方法,
    & X7 z- H8 l/ ?  U3 ~. Y1. 直接调用 vector inner_product 247s / q+ Z# H% B3 t
    2. vector 循环点乘累加 237s
    5 Z" g' O' `$ O4 E# m% \5 `8 G3. float * 循环点乘累加 204s
    / @5 ?# q& H; i' S0 O- A) Z$ @4. 空循环 100000 次 202s* N2 s8 t/ O8 k; N2 `

    1 `% P4 `5 c3 e不做内循环 200s
    ( a/ a$ O0 S# d- ?/ k0 v! o: Q
    ) |. o) }9 x8 q2 m! o6 h你昨天说的对,内循环本身占比是很小的,大头在其他处理。
    0 G& {* X1 g1 T  \$ {3 z' U另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
    / p, @9 d8 V/ y2 R, r) {' k/ ]* p$ U9 L- i9 z& ]
    至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
    ; G: g4 M1 e6 a0 X+ q0 y  X; o
    5 w, a2 j/ S9 j/ h0 P(为什么下面我贴的  b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成  jj 好了,原来 方括号里的 i 是斜体标志  LOL)
    , v1 s4 b! W  [' P  d& P) C# S
            std::vector < float > vec1(N);
    ( @1 I' m9 ~0 v1 D5 B( n1 ?4 I        std::vector < float > vec2(N);
    : \* {% i6 V7 F  P* Q        float* b1 = new float[N];7 t. {% W$ C" R2 T6 a- V9 d
            float* b2 = new float[N];$ G3 E/ r. o5 k6 z6 j  B% B

    6 F5 s4 T3 a- X        for (int j = 0; j < 6000; j++)
    + ~5 `$ w+ G( L3 n        {! d/ U1 b# g, b1 c# K) Z
                    std::generate(vec1.begin(), vec1.end(), []() {7 `# @& g9 Q& O4 i" W; m7 t! H
                            return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;" }3 n5 v) }% V0 E4 \. R5 Q( o, G
                            });
    - G  S, [: V$ a5 }! k( c' F0 G# F6 X4 ?; `1 L
                    std::generate(vec2.begin(), vec2.end(), []() {
    : p' a; k( J3 Q& Y                        return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
    ' w9 @- X6 h8 t+ D                        });9 u+ ^1 U6 f% x; h- m
    / @! D4 c/ a6 M$ ^* O; Z
                    for (size_t jj = 0; jj < vec1.size(); jj++)' q5 {7 E5 x( _7 D; z+ S
                    {
    * e- W5 [- y: f                        b1[jj] = vec1[jj];
    ) \+ b. S1 M5 {0 m; a/ T' C                }
    * [+ N: q5 i: ^& y% c3 e9 w  U
    8 X7 @! e" p/ h: a1 n0 _5 M, q                for (size_t jj = 0; jj < vec2.size(); jj++)
    ) z5 D! ~; x$ U. B! F- b                {
    8 W1 @: {) d; i' J                        b2[jj] = vec2[jj];
    7 v# w+ T7 U. C, s1 t                }
    6 {. U# S9 D' p7 x' }9 ^) H% c  O' [3 ^  c; H+ O- ]3 `$ c
                    //Method - 1  N=100000 247s  
    # p/ `+ l6 N" s# O# t6 V% W! c9 y: E                //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
    - m* I( Z; x7 h8 L" l$ ~" k; I                                
    - D$ I$ c0 O4 O5 M# P4 L                //Method - 2  N=100000  237s% Y5 `8 ~9 D- O9 [6 a
                    /*
      V' I! ?' ^& N) j- H# ^* N1 [                for (int jj = 0; jj < N ; jj++)
    # d, G& ^" J7 V1 x1 \2 I                {, F. X9 c% `3 @' i, j
                            fresult += vec1[jj] * vec2[jj];
    6 v+ d; r! ?- j, v                }
    / U' y7 I1 \" d                */3 \3 j7 k1 l5 }( x* |4 n& h
                                    / a  t. q4 O! b" b# `
                    //Method - 3  N=100000 204s" w% j. ^0 R0 @' \
                    /*
      j" O0 [: J6 h$ e2 r                for (int jj = 0; jj < N; jj++)+ J9 g4 A  l% N9 d( }* ~
                    {9 K: F  q" g% b) Y# {) O& U
                            fresult += b1[jj] * b2[jj];
    0 o- _1 A  T  l& `+ T                }
    & H. T; c: O" V# M                */
    & e* P& p0 p; ^# _, [3 P5 Y% e9 I& d8 j: |. p
                    //Method - 4   202s) ]. h  `- F. \/ }3 t! P
                    /*
    6 e" O- O& n2 T                for (int jj = 0; jj < N; jj++)" q0 j: y, G9 S7 w" D; K
                    {1 m6 `9 z2 C( j) J/ y% X
                            
    2 |$ x' R- |! w" `  O2 m2 ^                }
    5 y- y4 D# k8 }5 a4 `                */
    & a+ C# G7 P! F* T$ Q                //comment out all methods, N=100000  202s               
    ' i. E: D% l- u" F        }
    2 h4 k% I" t: ]  v; [8 X3 ?$ `1 W5 w4 \
            delete []b1;
    . H1 L3 ?! o  Z8 P( [6 e        delete []b2;
    / s& _! [/ g+ e
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    16#
    发表于 2022-9-27 00:15:38 | 只看该作者
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?
    " L4 Z- W% R! U4 d3 ~: A/ }! z: ~, W; ^0 S$ v  ?+ W
    你第二个试验里面的j在循环里面又重新定义了啊,你确定真的跑了6000次?
    6 f6 {: [6 ]/ k& L4 U- b
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    17#
     楼主| 发表于 2022-9-27 01:16:03 | 只看该作者
    机器猫 发表于 2022-9-27 00:157 w" L) E; \8 _1 Z. t! w3 @' e
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?
    2 b* }1 s* j! q4 ?. n7 {' i, S8 ^+ y/ T' r6 R1 F, j
    你第二个试验里面的j在循环里面又重新定义 ...
      n" H- z) l4 ^$ ?
    内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL
    " ?1 _& @5 c! Z( E8 _) w
    8 U- Q" i2 Z' Z4 }不和它较劲了,瞎耽误工夫,我已经转到 ubuntu, 也准备顺便试试 avx2 向量化。
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    18#
    发表于 2022-9-27 02:06:58 | 只看该作者
    雷达 发表于 2022-9-27 01:16% Y6 T! ~- c/ r4 n; M1 a: E
    内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL
    8 x# {! a4 j/ w1 t0 ^1 t$ d) i" m
    不和它 ...

    : q, N$ t- }6 X: G# ?6 Q8 N
    & e) v* S4 X% Y2 ^不过可以试试我说的register变量。前一个试验j是混在一堆其它变量里一起定义的,很有可能是在stack上,这样内存读写会更多,要是再碰上每次都需要加载cache就更慢了。
    " w+ {% O$ R5 \后面一个是在循环那里定义的,说不定编译器就把它优化成register变量了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

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

    使用道具 举报

    该用户从未签到

    20#
    发表于 2022-9-27 20:29:50 | 只看该作者
    雷达 发表于 2022-9-24 23:54
    6 D% G. C( h7 a& D' m: x# svoid xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)( l2 T2 p( \8 [' K7 Q
    {
    6 Z* M9 J# F9 j$ A! i        comp temp, xtimesy;

    , W1 S6 {5 R7 _8 x( p! E. O% e这个code里面如果Openmp没有被注释掉的话,那么temp那个变量应该是定义在循环里面,否则线程之间会存在争夺写入那个temp的风险。% Z* J- @% F$ P( R/ w: O* C; o
    内层for循环如果没有内部操作的话,编译时应该被优化掉了,和你完全注册掉整个循环是一回事。可能你的编译设置没有打开优化?
    + ~) U0 C3 u, m* gVS社区版没有问题,我工作用的就是社区版,设置正常的话不会比商业版差。以前游说头头用Intel Compiler,他说不想花钱,而且差不了多少,就一直用到现在。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2026-7-22 11:03 , Processed in 0.068943 second(s), 19 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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