设为首页收藏本站

爱吱声

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

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

[复制链接]
  • TA的每日心情
    擦汗
    2024-12-25 23:22
  • 签到天数: 1182 天

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2022-9-24 22:54:26 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
    C++ 比 Octave 慢好多,怎么破?; T) @; C+ X  l5 d" J& D% ^

    0 s* r1 n: x. r" E6 {自相关两层循环,内层循环涉及浮点数计算,试验了一下把内层循环内部全都 comment out 只留个壳子,  但空的内层循环本身就把速度拉下来了,看来问题并不在浮点计算。
    4 q. h/ h# E3 k/ W. W% q6 e: ?' U0 L& e$ s; g+ U- ]
    速度优化问题真的很有意思啊。
    # _6 v! S  I9 I! q/ x& l* F! @$ M$ B& @, N& o
    欢迎大家继续讨论

    评分

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

    查看全部评分

  • TA的每日心情
    开心
    8 小时前
  • 签到天数: 1884 天

    [LV.Master]无

    沙发
    发表于 2022-9-24 23:04:16 | 只看该作者
    拉下来?拉多少?+ t3 v+ G* L, X$ G! Y5 x
    把代码贴上来看看?# P* N5 O" B3 q( r6 l5 o( S
    & _9 t9 S. C: ^' j0 s% A) o
    难道分支预测不准破坏流水线执行?不该啊。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    板凳
    发表于 2022-9-24 23:15:41 | 只看该作者
    会不会代码本身的缺陷阻止了自动优化?另外,硬件配置和开发环境可能也有关系。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2024-4-22 03:36
  • 签到天数: 120 天

    [LV.7]分神

    地板
    发表于 2022-9-24 23:33:02 | 只看该作者
    Maybe Debug mode?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    擦汗
    2024-12-25 23:22
  • 签到天数: 1182 天

    [LV.10]大乘

    5#
     楼主| 发表于 2022-9-24 23:54:10 | 只看该作者
    本帖最后由 雷达 于 2022-9-24 23:57 编辑
    + P! H" ?  `- [% s; P4 e
    数值分析 发表于 2022-9-24 23:04
    / g( u/ F( o7 _; V' q! n6 W拉下来?拉多少?  O' Z9 Z# J  @  K
    把代码贴上来看看?

    ' j5 g- E5 ^4 |- ?# Z; z) H, }: ]7 P# C
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)9 [' d& R' r% S+ @5 ~/ c
    {/ D* D; g$ @! ~' E! m% a
            comp temp, xtimesy;
      I0 i+ F+ [% G; j5 T$ j* F        xtimesy.re = 0;
    6 Y; O+ h9 Q7 s8 B        xtimesy.im = 0;
    8 j1 T# |  D* C        int j0 = lenB - 1;
      x) D  a+ ~5 o, r, _: A% t3 R        int    i, j, i1, reali;, m" j4 l" k0 d9 g6 p; S1 X
            if (lenA % 2 == 1)
      j, L  K' x2 d: G                reali = lenA + 1;7 f8 e5 n0 e% B; |" F/ `
            else
    . ^1 C5 u8 i( Y$ s% F! E                reali = lenA;
    4 s' \( Q) h0 x2 J% B        reali /= 2;6 \. ^; i% p7 H) z8 [4 V

    6 I6 X8 f  \5 U0 c# U1 _* @. P  d% Z- d        int nconv = reali + lenB;% m& V, }8 Y1 J" ~0 o
            //#pragma omp parallel for
    / A  _. J- u$ n- F& t$ Y( K        for (i = reali; i < nconv; i++)
    ' {# ^( m% J3 i7 O) c3 s) O$ Y4 p5 e        {4 [4 y+ ~  L$ a$ _2 b( A$ d2 q4 c( |
                    temp.re = 0;- {/ m  p1 Z6 s6 i9 Q* D# f0 a- ~
                    temp.im = 0;+ g5 R: [1 Z3 b; x4 d# O. u
                    i1 = i;0 T3 o6 A: q3 M% w: j
                    for (j = j0; j >= 0; j--)
    ) J; q- ?" |" \  s8 C                {
    7 Q8 d8 _0 l; O5 U" `2 s& j                        /* floating date operation */
    9 t+ s' e9 N0 }9 H0 a. ~6 m3 T                }
    , A% P/ A# m- M" v* R
            }
    : X: e" R+ U; r2 {}
    , V( J! A' l1 v9 L$ H5 d& T- e! g. _$ U
    xcorr函数代码如上,comp是复数struct, 做过长度为11、19两个矢量的测试,和octave结果完全一样) Y) ~2 ^1 [2 h, e3 D

    * T7 \; {+ g. a% T红色部分是内循环,现在其内部操作都comment out 了, j0大概是 6000。6 k9 k" \! Y2 g* \" |: P
    现在call xcorr 100次,耗时78s.
    . y7 s) a! b0 h3 ~& z' m' E2 x1 H8 P' d; f* D) X+ r0 m
    如果把红色部分内循环本身完全comment out, call xcorr 1000次,耗时 <1s. ( j3 j2 @0 n3 w/ i$ `$ G$ B7 \, R
    7 z8 x( H% N2 _( ]8 k( M6 @) `
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    擦汗
    2024-12-25 23:22
  • 签到天数: 1182 天

    [LV.10]大乘

    6#
     楼主| 发表于 2022-9-25 00:17:17 | 只看该作者
    风雨无阻 发表于 2022-9-24 23:33, [- y- E3 O+ C  }1 y  H
    Maybe Debug mode?
    / {8 e% _8 ~. |: H5 ?, r3 {* i

    % i( C$ a: R, U( ~不应该,看我上面的回复。+ O& J2 i1 r  @
    % q9 H# q+ F) G; N, O
    我更怀疑是 VS 社区版的问题
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    8 小时前
  • 签到天数: 1884 天

    [LV.Master]无

    7#
    发表于 2022-9-25 00:20:10 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 00:24 编辑 # Q1 v( K& k" H! d7 C
    雷达 发表于 2022-9-24 23:54) A: I& b  ?' `* f) O$ V
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    0 p0 \1 u: K" j9 W! ?) Q{7 E# @5 |( n2 K& ^' t
            comp temp, xtimesy;
    & P! b8 [9 E4 s7 L. _3 i
    : k4 \+ K) q- R  ^
    这个不是这么比的吧。。。9 y: N$ P" o( z$ i* l; [2 m9 [' p1 w
    5 {* w* @4 G2 I  U/ u8 S* q, X
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。  D6 z9 A& E: W4 [! c$ A% J

    , E6 ^! q' l. [0 q. r而加上内循环,光jmp和dec指令就至少多执行了6000个,慢个几十倍不是正常的么?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    擦汗
    2024-12-25 23:22
  • 签到天数: 1182 天

    [LV.10]大乘

    8#
     楼主| 发表于 2022-9-25 00:46:56 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 01:09 编辑 6 N$ q: X2 T6 V" O/ V9 v
    数值分析 发表于 2022-9-25 00:20: I: g* P' x/ i# X' ~
    这个不是这么比的吧。。。6 a8 d7 F' `% ?8 c8 t7 S

    8 V  s7 Y) n; R: I4 d: m# K; K您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    2 m; c0 t& v6 g6 Q

    2 r3 T0 |$ G: w! `* ]- o有道理。1 W2 S8 |/ @# Y: n
    所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,记得 numeric 库里有算向量内积的,我回头试试。/ ~0 Y. Z7 }; J6 o, R8 f& G( r( D
      x  E  m, j( I  ?1 z
    我先尝试尽量用标准库,一个小程序,不想搞得太复杂。多谢了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    9#
    发表于 2022-9-25 01:27:53 | 只看该作者
    雷达 发表于 2022-9-25 00:46
    5 @+ a, J- \: n4 i' {# T5 F有道理。) r  i+ c/ O' G* b  _# |& |
    所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,这大 ...

    9 Z& j# W, e( g# J" O" {- D你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子,把循环本身翻译成机器指令loop或dec/jnz,两者速度上会差很多
    / n5 H3 e! S! dWhy is the loop instruction slow? Couldn't Intel have implemented it efficiently?
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    10#
    发表于 2022-9-25 01:48:51 | 只看该作者
    数值分析 发表于 2022-9-25 00:20
    # B) d6 w8 a) R( h这个不是这么比的吧。。。
    9 h3 l5 a. {9 [$ b% m
    + w0 o  \. t' g* U/ \" `您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    而加上内循环,光jmp和dec指令就至少多执行了6000个

    : R7 F4 a3 H" F8 S+ P: a) l3 t+ L- C. O7 f
    现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果循环这样跑,花不了多少时间。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    8 小时前
  • 签到天数: 1884 天

    [LV.Master]无

    11#
    发表于 2022-9-25 02:06:44 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 02:16 编辑
    ' T* L1 _5 {2 F( N" T
    沉宝 发表于 2022-9-25 01:48
    4 n& _. A9 r  @& P# y$ f- l+ k现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果 ...
    * [9 z$ z7 ^9 }0 b

    ; k& S* k' V( v2 L& ?4 W: w是的,兄台说的对。
    9 ]- g2 D3 O+ c1 x6 U1 X+ T
    - ]4 O" N8 K) R7 j+ n3 w其实我想说的是 真正数值计算部分和代码中其他不直接计算的overhead的比值这个事儿。
    ' L8 w# ^; U4 M" a+ {4 |) J5 z/ A4 ^+ t' v& j
    雷达兄构造测试用例的时候,屏蔽掉了所有计算的部分,使得剩下的都是overhead,这样run time比较的结果就显得好像不合理了。如果把计算加回去,计算部分的run time会dominate,结果就不那么离谱了。因为不好说,所以用指令数对比的方式试图直观地说明这一点。
    8 w  E4 t: O% F3 R! P" Y: ^. N  S; ~
    比如说,如果有计算,那么跑六千个循环相对于计算应该用不了多少时间。但是如果一边是什么都不做,另一边是六千个循环,那六千个循环比什么都不做慢几十倍了,就不是那么不合理了。+ d! y/ ], M+ m" U6 x( e
    7 M* ~7 h1 x! E) L: c
    当然也有可能像兄台说的,是优化参数的问题,但我觉得更多地是测试用例设计的不合理。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    擦汗
    2024-12-25 23:22
  • 签到天数: 1182 天

    [LV.10]大乘

    12#
     楼主| 发表于 2022-9-25 04:47:43 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 04:49 编辑
    . X! V- z) ^+ [. G/ @1 w5 D
    沉宝 发表于 2022-9-25 01:27
    # R5 X& u8 @9 Y: O你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子 ...

    3 v: @+ f% `: K% }/ J3 L0 p1 d5 ]( u! F
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差一倍,我上面这个差的太多了。7 t$ r; G0 T, k9 o9 C: a, l

    $ f$ v& i, ?! c9 z; H8 q我已经完全懵了。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    13#
    发表于 2022-9-25 05:51:23 | 只看该作者
    雷达 发表于 2022-9-25 04:476 N) I, Q, \7 f7 g) s
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...

    # \! ?* O) h4 R0 c: k时间差一倍的结果可以接受。
    - Y( o6 X/ H8 n5 h8 m" @# F. U
    你还是用profile工具看看吧。现在大家都主观瞎猜。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    8 小时前
  • 签到天数: 1884 天

    [LV.Master]无

    14#
    发表于 2022-9-25 14:58:59 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 15:38 编辑 : q9 N2 Z6 }# k" {
    雷达 发表于 2022-9-25 04:47
    / x" P4 K7 n- k& p又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...

    : U9 V9 t+ q% `: h' H+ J
    % D  D1 |1 |7 V. g; {3 @
    6 ~- i' e3 {3 p9 L. P1 M" f) z3 \% [/ u% A
    能不能把这个也贴上来,看看和上一个有什么不同?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    擦汗
    2024-12-25 23:22
  • 签到天数: 1182 天

    [LV.10]大乘

    15#
     楼主| 发表于 2022-9-26 01:30:03 | 只看该作者
    本帖最后由 雷达 于 2022-9-27 01:17 编辑
    : \, V# O% b3 ?- C& N2 h
    数值分析 发表于 2022-9-25 14:58
    3 k( u5 [/ L8 _0 _# n( B$ q' ?# V能不能把这个也贴上来,看看和上一个有什么不同?
    8 h; R5 d6 J& I1 T; x- ~# Z
    理了理思路,重新做了一个测试。* V4 S' d5 a0 A  |+ a
    做了两个 vector 和 两个 float *, 都长 100000! ^! N: p1 q6 [1 \
    外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.2 R5 Z: C# [( v+ D2 J
    - U6 R4 n- e" \( U
    内循环试了4种方法,$ D# k* K7 u; p! K) N: V5 I
    1. 直接调用 vector inner_product 247s
      X$ f2 m3 i  M+ x, \; K3 Z* b9 r2. vector 循环点乘累加 237s: n# `3 u; w  K+ `- n' g/ i6 _, |
    3. float * 循环点乘累加 204s
    3 l0 q- n3 R: b2 Y$ I9 k2 y4. 空循环 100000 次 202s
    4 L8 v: Z) {- |) I7 A0 \
      X. V9 ]9 a0 {( z3 c8 g. d不做内循环 200s5 u" X4 ~' v" z0 d

    9 a7 M- h8 v  `你昨天说的对,内循环本身占比是很小的,大头在其他处理。% M: D, z! u* M  D+ p9 u1 x0 j
    另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
    " D, E  K5 b) Q, d8 E( V4 o% W$ x+ h5 C
    至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
    ; U% P% Y" M0 O! a7 Y
    ! Q+ d& E" }( l) |) \(为什么下面我贴的  b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成  jj 好了,原来 方括号里的 i 是斜体标志  LOL)
    # p4 {1 Q! H% _( V3 w
    / @, c1 l& {2 Z( r7 i+ F
            std::vector < float > vec1(N);/ {1 ]3 H  P" K$ \, ]# a2 b% l* |
            std::vector < float > vec2(N);
    # y7 T' [6 b# C2 z& c        float* b1 = new float[N];' G, P/ ^8 P' a  W/ u% H
            float* b2 = new float[N];4 B$ X, ]5 r: P) N

    5 S( h/ f% k0 d2 i2 z        for (int j = 0; j < 6000; j++)
    8 n7 ~7 T8 b- {8 o3 D+ I        {
    $ w7 h/ d: |+ n                std::generate(vec1.begin(), vec1.end(), []() {! \7 W* x) l6 ?' h
                            return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
    ) g6 }$ U* Q, w                        });: `  X+ o  V& |. ^
    ( x# x3 B/ H, `+ ]) I
                    std::generate(vec2.begin(), vec2.end(), []() {
    0 f0 w# n2 k% `9 _+ r                        return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;& U7 S' N4 S+ H9 {2 M4 L# J" }
                            });
    : M+ h: \& G2 x: \5 Q2 O! b, e3 e
      F$ c+ L! O! B$ ~( `, g- C5 [                for (size_t jj = 0; jj < vec1.size(); jj++)
    - a) o4 c' h1 T( p, [0 y- b/ F                {* H" l$ r) N9 N  `2 S8 U& f$ R# O
                            b1[jj] = vec1[jj];
    ! k' s; ]1 u$ a; Z: Y                }
    , p1 q$ Y& M0 x0 O8 M
    1 f/ F  ^3 h0 P: d+ X2 L                for (size_t jj = 0; jj < vec2.size(); jj++)' L% l$ m* V' Z/ p' {. r
                    {
    & i! H) K7 j) S5 _& J, r/ n: S$ c' N                        b2[jj] = vec2[jj];8 L0 ]# c% y! U( _
                    }- e& {$ @8 A! u% q$ i& X& h1 a

    1 B  H# J' R9 ?; ]) f1 F: ~! \6 N                //Method - 1  N=100000 247s  
    ; C2 g* ~- l$ Z( X                //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);0 m1 }( d/ F3 ]6 p  M
                                    4 d+ k2 |7 l& `( K; [) }- D- S
                    //Method - 2  N=100000  237s
    % {# V6 w6 u% O7 P/ G7 K7 @                /*
    8 C7 R% E6 k) M) E0 g                for (int jj = 0; jj < N ; jj++)
    / T$ }$ D5 `  f6 q+ T                {
    ) i5 _  W! r6 K7 l4 |                        fresult += vec1[jj] * vec2[jj];
    & ?0 K  m( ~$ b; E- S                }# Y3 t1 a' ^  h3 W$ S  y
                    */
    ' X& {2 E8 k- M5 f                                0 T* G+ Z/ Z. c5 Z. D" f$ K6 d& b
                    //Method - 3  N=100000 204s$ f* j' `# _: v: L2 S( p, Z4 f
                    /*
    6 u8 j, s; s5 R                for (int jj = 0; jj < N; jj++)2 u, T  |; C9 D* F
                    {
    ) L$ e3 Y8 V" m# [, Z                        fresult += b1[jj] * b2[jj];
    & I! p* V0 i3 e" U                }1 n7 U, c  F0 i4 g( [- B
                    */+ ^. T6 A* [# t0 Q1 X6 r) m6 U

    $ S8 a6 L0 I$ O. F0 i# q                //Method - 4   202s' T4 D9 A8 h* \$ z. ^
                    /*
    4 a3 v/ _4 L) g# P                for (int jj = 0; jj < N; jj++)
    6 U  ?$ d# |/ H; U% w                {% B) j/ c! m# g! ~$ g0 j
                            . u* s& ]3 l, [- t( _" l0 }
                    }
    - |: Y- B2 q( a7 a7 z, v: m8 f                */& {0 l' H" B" m7 D/ s6 _0 t
                    //comment out all methods, N=100000  202s               
    : n# r0 X  X4 o$ u        }
    # r8 C3 V0 _* N0 m6 k! R0 c! V# f% y; n5 f- g1 t- H
            delete []b1;* L) }. B, B/ h& |
            delete []b2;

    " `; O/ @" t1 e. s: ?5 I/ F
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    16#
    发表于 2022-9-27 00:15:38 | 只看该作者
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?4 |9 d  a" F" j/ {

      _( T7 B+ @! y  d: [. E你第二个试验里面的j在循环里面又重新定义了啊,你确定真的跑了6000次?+ f! i6 ]0 V: i
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    擦汗
    2024-12-25 23:22
  • 签到天数: 1182 天

    [LV.10]大乘

    17#
     楼主| 发表于 2022-9-27 01:16:03 | 只看该作者
    机器猫 发表于 2022-9-27 00:15, \' R$ r3 |5 p, h: R) Z
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?
    - |  ?. k/ r4 g! ~' T
    " v/ l9 L3 G) m7 {6 D7 E. K% E/ ?你第二个试验里面的j在循环里面又重新定义 ...
    ' t. d9 y1 ?$ v9 u- U( U9 K# m
    内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL3 a9 H2 h6 s# J! u2 {' F+ E8 s" o
    & S: ]4 G+ X4 T. G5 E
    不和它较劲了,瞎耽误工夫,我已经转到 ubuntu, 也准备顺便试试 avx2 向量化。
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    18#
    发表于 2022-9-27 02:06:58 | 只看该作者
    雷达 发表于 2022-9-27 01:16% o) O8 I  n  i6 c
    内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL; v3 e# B  ]7 E; J

    , U8 ?- ?, E' |/ F  m不和它 ...

    & `# A& [2 }* o3 [/ }, d5 a4 Z) R# M( @1 j/ k, C" Y2 c" q7 j
    不过可以试试我说的register变量。前一个试验j是混在一堆其它变量里一起定义的,很有可能是在stack上,这样内存读写会更多,要是再碰上每次都需要加载cache就更慢了。& u! G1 i: @9 M4 A  E0 w7 o
    后面一个是在循环那里定义的,说不定编译器就把它优化成register变量了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

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

    使用道具 举报

    该用户从未签到

    20#
    发表于 2022-9-27 20:29:50 | 只看该作者
    雷达 发表于 2022-9-24 23:54
    6 A( k' E+ Q4 f4 f- ^5 bvoid xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    2 L- m! u. K# T6 _1 z, q{5 F# ]5 |7 L  ]8 ?% O
            comp temp, xtimesy;
    0 z0 l  K, Q& _1 X- I$ W$ D+ b6 A
    这个code里面如果Openmp没有被注释掉的话,那么temp那个变量应该是定义在循环里面,否则线程之间会存在争夺写入那个temp的风险。7 e2 k% u- {/ Q  G* l2 U3 `
    内层for循环如果没有内部操作的话,编译时应该被优化掉了,和你完全注册掉整个循环是一回事。可能你的编译设置没有打开优化?
    ( w5 ~/ j9 G5 aVS社区版没有问题,我工作用的就是社区版,设置正常的话不会比商业版差。以前游说头头用Intel Compiler,他说不想花钱,而且差不了多少,就一直用到现在。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2025-5-11 09:49 , Processed in 0.084043 second(s), 20 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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