设为首页收藏本站

爱吱声

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

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2022-9-24 22:54:26 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
    C++ 比 Octave 慢好多,怎么破?
    8 {7 H7 X# M1 K6 S- `7 _5 h( {- {' O4 x2 P+ _7 T' `
    自相关两层循环,内层循环涉及浮点数计算,试验了一下把内层循环内部全都 comment out 只留个壳子,  但空的内层循环本身就把速度拉下来了,看来问题并不在浮点计算。
    " v, d9 h. z6 @# ~: \0 `9 Y
    8 k' U0 t% i* g2 r/ v# r* s5 d速度优化问题真的很有意思啊。
    ( ^- u/ Q# ~! I+ g5 x: R& L* D% M5 z$ z
    欢迎大家继续讨论

    评分

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

    查看全部评分

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

    [LV.Master]无

    沙发
    发表于 2022-9-24 23:04:16 | 只看该作者
    拉下来?拉多少?) [8 q" ~" `, q  z! T( `
    把代码贴上来看看?
    $ X( `9 k1 G& z7 j' H3 Y* U% t4 B1 _
    难道分支预测不准破坏流水线执行?不该啊。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    板凳
    发表于 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 编辑
    ' @7 }8 ]/ |4 W8 \
    数值分析 发表于 2022-9-24 23:04' V! r  J& g3 t/ X9 b! B. T$ o  y
    拉下来?拉多少?
    " z6 \5 [9 B2 P: g把代码贴上来看看?
    4 \) C0 o0 G" E! |; u
    ! O5 F6 M+ o0 o( n6 `3 Z- b
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    " j7 J+ r) t2 f" u9 W{3 ?/ ~# D& Y) S; Q! I3 H7 a2 g. J
            comp temp, xtimesy;
    5 F1 u+ ^$ T2 E* J- G        xtimesy.re = 0;9 U  Q) F8 W7 s; t5 m# z
            xtimesy.im = 0;& f/ r. ~5 @8 V8 K7 ?9 J/ P
            int j0 = lenB - 1;$ K4 P7 q: n! ^
            int    i, j, i1, reali;0 `9 ], F& m; V0 L5 i1 ~2 j
            if (lenA % 2 == 1)
      v" O$ X( j+ D1 o7 e                reali = lenA + 1;% R. Y, U( t, o+ A: x
            else: O- s0 C, y, ]* y+ H' m1 V
                    reali = lenA;( o! c6 e( m. A1 i- Q. e
            reali /= 2;( ^& Q- B9 N) g

    & F1 ?- i6 P& `0 \+ g1 t; z        int nconv = reali + lenB;
    , N8 y; E! l" J6 f; s        //#pragma omp parallel for# r# c. N: p& g. r# W  O
            for (i = reali; i < nconv; i++)/ T1 Y9 U5 C* t6 f( ~% m$ H
            {
    7 B3 ?: f8 W- ]8 w( R) Z8 t                temp.re = 0;
    # [& U! K+ U0 r7 H                temp.im = 0;" |& m  ]$ U5 B9 i% ~, S
                    i1 = i;0 u/ t5 d" t' B3 H( C4 v
                    for (j = j0; j >= 0; j--)
    + n4 P  l( R: B% G& I+ f8 b+ C                {
    ! V4 h3 _  \4 K+ h# P8 E# ?                        /* floating date operation */
    ' S- W) }9 D5 M- m4 Q6 l1 c! ?; u                }

    0 ]1 k4 M" X' |        }9 `  U" r7 P( R) R5 |7 y# V% j
    }9 S4 F4 Q; }: A9 V5 p

      Q+ S  N8 e# Z4 X4 E/ {% [" Lxcorr函数代码如上,comp是复数struct, 做过长度为11、19两个矢量的测试,和octave结果完全一样
    4 I0 O* ^; C$ f3 z9 l5 N: D5 W3 \6 E' z
    红色部分是内循环,现在其内部操作都comment out 了, j0大概是 6000。
    * E2 F. C) r- `( j现在call xcorr 100次,耗时78s.
    ( D( Y0 S8 g0 o3 Q
    + u; u* T$ W+ b如果把红色部分内循环本身完全comment out, call xcorr 1000次,耗时 <1s.
    ' ?- T9 X4 D8 |3 j; d) C" I, i
    ; Y4 E6 M' G5 W5 E
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    6#
     楼主| 发表于 2022-9-25 00:17:17 | 只看该作者
    风雨无阻 发表于 2022-9-24 23:33
    6 L5 W# Y) }# e# N( `- R5 {7 rMaybe Debug mode?
    ; p: g* F1 t* S7 h

    1 a  y, n3 P# v- m: _8 {% I8 a3 ~% e5 W不应该,看我上面的回复。
    1 i: ?$ ]2 `9 i- c; G' j( c' h- x3 @. V1 O/ V: _0 B* {4 Q
    我更怀疑是 VS 社区版的问题
    回复 支持 反对

    使用道具 举报

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

    [LV.Master]无

    7#
    发表于 2022-9-25 00:20:10 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 00:24 编辑 + y. S% S* L! y+ f
    雷达 发表于 2022-9-24 23:546 {: l3 P* }3 ?
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)2 L% m7 L  i0 @/ U4 X/ r8 A
    {
    " V2 x' U: w7 e+ w# n        comp temp, xtimesy;
    - ?" `0 D* W0 m! N. T( {5 K3 ~

    ' r6 |$ j" Y' M& T5 {. W这个不是这么比的吧。。。) O; A  z7 G6 Q; {- M8 v- o

    9 q0 ]2 U) ?3 I! [您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    4 }. S$ M4 i. z! X! x* |7 ]
      M! K3 l. f7 z+ Z6 z而加上内循环,光jmp和dec指令就至少多执行了6000个,慢个几十倍不是正常的么?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    8#
     楼主| 发表于 2022-9-25 00:46:56 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 01:09 编辑 & d, ], q+ Q8 y( ^2 m5 S6 O; I/ F4 W
    数值分析 发表于 2022-9-25 00:20
    ; y3 j% u6 {: W这个不是这么比的吧。。。2 ~0 J# y2 l& ]; u  G1 [1 z
    3 ~  e" n8 a/ Y4 _* \& m7 ]# f( ]
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。

      h; \- N# x7 m1 e3 c, Q3 l8 K* c/ E0 I) g, J+ m+ F
    有道理。9 t0 J7 E% b% J  m6 ?0 R
    所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,记得 numeric 库里有算向量内积的,我回头试试。  Z# L+ R: f6 U. b! l7 v& z  K

    . k5 _8 n) y1 A$ ^! T% ]0 }# G! c我先尝试尽量用标准库,一个小程序,不想搞得太复杂。多谢了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    9#
    发表于 2022-9-25 01:27:53 | 只看该作者
    雷达 发表于 2022-9-25 00:46+ C" b. l* W- ]0 k) j6 v4 X
    有道理。- P# T! \& n3 {( A
    所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,这大 ...

    % g! P0 j! j; D* I你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子,把循环本身翻译成机器指令loop或dec/jnz,两者速度上会差很多0 \. G5 U5 j( D  G
    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% {5 S" [& T1 \/ T
    这个不是这么比的吧。。。
    & k( C% k# i1 @; q0 Y# U- t# g% W; X5 E9 q
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    而加上内循环,光jmp和dec指令就至少多执行了6000个
    % h4 |: j+ _) [* ]' w+ E  o) z
    * W+ t/ o. q9 [' d# q0 u' P% F! `
    现在的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 编辑 0 b/ k3 H) z9 P$ |/ ^( A+ z2 U
    沉宝 发表于 2022-9-25 01:48
    6 v0 H$ I& D6 t+ J5 F3 ~- {现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果 ...

    " i% Q$ [3 V0 s- f* P4 Z' e) n! R1 `- u1 ]! b2 E
    是的,兄台说的对。
    + P4 |9 U- ^& Y* R2 ]- O2 G0 S( ^, |. H# E! }' z
    其实我想说的是 真正数值计算部分和代码中其他不直接计算的overhead的比值这个事儿。
    - _& F) K& k9 l1 ~& a7 _! a- p/ C( g; m- R8 e8 V
    雷达兄构造测试用例的时候,屏蔽掉了所有计算的部分,使得剩下的都是overhead,这样run time比较的结果就显得好像不合理了。如果把计算加回去,计算部分的run time会dominate,结果就不那么离谱了。因为不好说,所以用指令数对比的方式试图直观地说明这一点。" L$ o  |5 a& ?
    * E, Z5 X5 L9 W' h' y
    比如说,如果有计算,那么跑六千个循环相对于计算应该用不了多少时间。但是如果一边是什么都不做,另一边是六千个循环,那六千个循环比什么都不做慢几十倍了,就不是那么不合理了。" f1 @4 Q; U; y9 C. F
    / B8 ~) J7 N# S5 `
    当然也有可能像兄台说的,是优化参数的问题,但我觉得更多地是测试用例设计的不合理。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    12#
     楼主| 发表于 2022-9-25 04:47:43 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 04:49 编辑
    , c4 N4 _* c! e0 z
    沉宝 发表于 2022-9-25 01:27( \* m# |+ C# y0 v
    你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子 ...
    ! y: i$ G1 t9 ~7 {/ \# o" R

    0 k1 J8 a% \8 Y6 P5 A! F又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差一倍,我上面这个差的太多了。
    4 G* s) Y" @! J8 Z7 z! r+ ]
    & _% s- r8 u6 N2 I5 i/ \# z! R0 K我已经完全懵了。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    13#
    发表于 2022-9-25 05:51:23 | 只看该作者
    雷达 发表于 2022-9-25 04:47
      P3 e* I" s1 `, C6 I又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...
    : }  V' A9 U3 Z( Q1 A
    时间差一倍的结果可以接受。
    5 r6 \% H1 [. [9 X1 M+ L
    5 c) D9 N7 z6 P你还是用profile工具看看吧。现在大家都主观瞎猜。
    回复 支持 反对

    使用道具 举报

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

    [LV.Master]无

    14#
    发表于 2022-9-25 14:58:59 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 15:38 编辑
    ) w: T& Z. m7 d4 |$ [8 u
    雷达 发表于 2022-9-25 04:47
      B* h5 ~: \+ y5 e& ]6 R) _又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...

    " W: [* D- ?5 G4 x) L
    ; ]4 c# M' _, R: t1 x; C6 I4 G( J
      p, E" G! F9 Z: L0 ?9 K6 m
    能不能把这个也贴上来,看看和上一个有什么不同?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    15#
     楼主| 发表于 2022-9-26 01:30:03 | 只看该作者
    本帖最后由 雷达 于 2022-9-27 01:17 编辑
    ! i- _1 y) N$ A0 f! E( a" E# Z
    数值分析 发表于 2022-9-25 14:58; |9 X5 W, S+ u) |
    能不能把这个也贴上来,看看和上一个有什么不同?

    7 S, v) M: n% M- U理了理思路,重新做了一个测试。1 H) K3 W) o$ J$ a1 r
    做了两个 vector 和 两个 float *, 都长 100000
    ( s$ G# }8 J% c) z3 Q外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.. [& A2 U/ C; t5 R- `

    3 R' d! Z9 w) U2 V: i! l9 \4 z内循环试了4种方法,9 d2 `$ I- F/ d2 X  }+ d# O
    1. 直接调用 vector inner_product 247s
    ) T9 [* f) m5 o* l& X, u# Q( \9 g2 I2. vector 循环点乘累加 237s' r, s: W2 A4 P
    3. float * 循环点乘累加 204s
    4 Q3 w: c* q, m0 D' z4 G4. 空循环 100000 次 202s
    6 |, j) N! x/ y- }1 j. N6 @& `2 Y+ X9 p9 p! S0 d
    不做内循环 200s5 Z, h  X5 ]7 h! T

    % e2 C' K5 X5 z9 S你昨天说的对,内循环本身占比是很小的,大头在其他处理。
    & l* `) v( X! h& Z/ P/ s/ B另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
    0 \" v( w' v" a7 u! H- Y+ ^, \, g+ Z! L7 C1 H; W" @6 Z7 a* F
    至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
    , u$ c% Y0 [& r2 _+ k- X( T2 B) u7 A+ W! R  F  ]
    (为什么下面我贴的  b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成  jj 好了,原来 方括号里的 i 是斜体标志  LOL)
    ! d' G) E( ?( p& _' x, p( O; c  W# V" ?7 I* m% J  k
            std::vector < float > vec1(N);. d9 ~2 ^9 r& j
            std::vector < float > vec2(N);; G& j# m( U" D
            float* b1 = new float[N];9 h+ D1 I& r1 d
            float* b2 = new float[N];
    2 ?4 s8 V( `$ Q- v( S! \* @
    # o% N- l- k3 x8 Q        for (int j = 0; j < 6000; j++)
    ) U. L6 w6 F; d; m3 Q/ a        {
    # S0 Z* C# z. }: p9 P                std::generate(vec1.begin(), vec1.end(), []() {3 @$ Q% ~& S- v. a& |: z
                            return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
    7 w3 B$ q; _8 Z1 B                        });/ S7 o$ {- l2 B' m$ Y* C4 A
    & p6 m, x1 F9 q' O
                    std::generate(vec2.begin(), vec2.end(), []() {
    ' ?) E2 x, x3 i: |! [. ]9 g                        return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
      S' r9 z: t2 R7 T/ L5 L                        });8 o+ _7 E( M% s9 e
    2 Q( p- j1 I! e! c- x$ B
                    for (size_t jj = 0; jj < vec1.size(); jj++)
    , j( g, V) u, S5 z1 x/ ]$ y                {. o+ \& ]3 i1 F" b
                            b1[jj] = vec1[jj];# l6 e# R/ _3 u  T( m& F
                    }  t- P0 `7 F% e$ \8 ]! h4 ]' j. P

    + V4 q4 j5 M3 y) h( o7 U                for (size_t jj = 0; jj < vec2.size(); jj++)3 d- \0 S% O. w0 e5 l
                    {+ N# a7 p9 _, ]
                            b2[jj] = vec2[jj];
    # [# z. d* d( h* f5 J% s8 `/ A                }
    8 O) B, q$ \, v4 v. Y# ~, n
    + l% c2 `, ^0 s. ~( O- f; [                //Method - 1  N=100000 247s  
    9 u. H( M" A" |                //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
      ]/ N# Q+ Q" P. v+ |: M. o- ?                                3 |" w0 s% ~) N' {  U
                    //Method - 2  N=100000  237s7 M5 v$ j( A" Q/ e
                    /*: b9 l; {6 w. U# A3 g# T' o2 H8 k
                    for (int jj = 0; jj < N ; jj++)9 i; y: X! u# G9 `+ \
                    {
    ) d9 N6 }/ t4 i. F$ F) q4 V0 R9 A# Q                        fresult += vec1[jj] * vec2[jj];
    6 f4 X0 a* G  W: k; S( n                }% K& V( ^, U* f* o8 K
                    */
    0 t6 o* C' z# _3 |                                
    * Y5 X/ t; e! A) v. t; g8 B1 {                //Method - 3  N=100000 204s3 a0 j  p" `8 o8 y" X; [. f1 g
                    /*" Q0 B9 {" y% @- H" o
                    for (int jj = 0; jj < N; jj++)9 Z; u! L" |5 H3 @, {% ^& u
                    {
    ! T; U+ o9 ]/ L% ~/ c8 n9 \) C                        fresult += b1[jj] * b2[jj];4 b' u( v3 _. ^  z
                    }
    ' p! n, L6 m9 n* T4 B                */( W6 s6 x+ C( S8 C1 [6 S

    # l! C2 w% R, p5 C                //Method - 4   202s
    4 v6 u* b" P: q( n7 {0 C                /*+ q% v. D* m6 y4 H0 ]- s
                    for (int jj = 0; jj < N; jj++)" w7 y0 A7 [4 W4 }" s, k# Z
                    {0 g, E5 _9 x8 h6 N
                            5 g% C  f3 M) n  W# j) [" {
                    }& b4 L8 w+ U# l+ Q2 S$ d+ u
                    */
    $ |. {. k& U- a# E' S                //comment out all methods, N=100000  202s                * `% ]5 ~1 z$ p  k
            }4 J# \, m/ v, \+ D& |8 ]

    ; W8 k4 X( f3 Y: ?& e% `        delete []b1;% }) z! r) l# F% s, O# @2 i5 _7 J9 e! s* l
            delete []b2;
    * i& ^6 r% D; |1 a: P, H. G
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    16#
    发表于 2022-9-27 00:15:38 | 只看该作者
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?
    ! N5 X  p. E! ]6 ^  O( j# b
    5 q: r6 [$ U4 ~+ Y, w1 n你第二个试验里面的j在循环里面又重新定义了啊,你确定真的跑了6000次?
    - p- `. Q0 ?) J! s/ Q9 S
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    17#
     楼主| 发表于 2022-9-27 01:16:03 | 只看该作者
    机器猫 发表于 2022-9-27 00:153 ~$ v" W) |) k
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?
    7 m) q% s, Q* |; @/ M2 W. a, z0 t# _( p
    你第二个试验里面的j在循环里面又重新定义 ...
    & J8 y# n7 i/ k! c  _/ R& o& D! A
    内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL
    + o; j/ o0 N/ A3 `# Z8 \- D% i9 E0 @
    不和它较劲了,瞎耽误工夫,我已经转到 ubuntu, 也准备顺便试试 avx2 向量化。
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    18#
    发表于 2022-9-27 02:06:58 | 只看该作者
    雷达 发表于 2022-9-27 01:165 _8 Y5 b, K6 {
    内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL
    ; b6 @/ T6 ~& R: X
      n5 e, H7 q& [1 t不和它 ...

    ) W' c- b! m2 F, K6 m# X/ K& A
    / N% ^& ~( a! \) q/ S& _不过可以试试我说的register变量。前一个试验j是混在一堆其它变量里一起定义的,很有可能是在stack上,这样内存读写会更多,要是再碰上每次都需要加载cache就更慢了。& j$ F' o2 j) S, a& i# ~
    后面一个是在循环那里定义的,说不定编译器就把它优化成register变量了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

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

    使用道具 举报

    该用户从未签到

    20#
    发表于 2022-9-27 20:29:50 | 只看该作者
    雷达 发表于 2022-9-24 23:54
    ' X4 X, g( O  n, T$ [. @void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)# X. j0 @! x5 s' P. d7 b0 L8 O
    {& k. j* O0 y2 K3 C
            comp temp, xtimesy;

    ) L- H% T' ~3 r! z6 E这个code里面如果Openmp没有被注释掉的话,那么temp那个变量应该是定义在循环里面,否则线程之间会存在争夺写入那个temp的风险。% f( O5 Q5 w  E3 P% W" _8 w
    内层for循环如果没有内部操作的话,编译时应该被优化掉了,和你完全注册掉整个循环是一回事。可能你的编译设置没有打开优化?+ `& g7 [- l5 _+ t
    VS社区版没有问题,我工作用的就是社区版,设置正常的话不会比商业版差。以前游说头头用Intel Compiler,他说不想花钱,而且差不了多少,就一直用到现在。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2026-1-20 07:37 , Processed in 0.064783 second(s), 19 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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