设为首页收藏本站

爱吱声

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2022-9-24 22:54:26 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
    C++ 比 Octave 慢好多,怎么破?" _- h2 \- Z, u* W! a" E$ c+ x
    , _# t, h) X' Y! J
    自相关两层循环,内层循环涉及浮点数计算,试验了一下把内层循环内部全都 comment out 只留个壳子,  但空的内层循环本身就把速度拉下来了,看来问题并不在浮点计算。$ M" K/ L9 u: c. C9 f* v+ a. f! {

    9 n9 n: C/ M' U% t; T3 G& z" {速度优化问题真的很有意思啊。
    ( `, L! u$ q* \8 H9 F, N8 E# F
      I; J3 w4 @! I! m. c欢迎大家继续讨论

    评分

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

    查看全部评分

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

    [LV.Master]无

    沙发
    发表于 2022-9-24 23:04:16 | 只看该作者
    拉下来?拉多少?" ?2 c4 \5 ^6 f0 d
    把代码贴上来看看?0 w& G2 L; Q. ]& v5 p

    , p/ T. u- A4 w/ J( h) x9 o" G难道分支预测不准破坏流水线执行?不该啊。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    板凳
    发表于 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 编辑 9 m. }7 `/ x# z6 K
    数值分析 发表于 2022-9-24 23:04( l# r; q! ^8 O: V
    拉下来?拉多少?
    7 Y; r5 G1 ?9 u' f; B: n8 i- m$ U把代码贴上来看看?

    1 s7 R) L/ Z6 u2 X2 I  A( _4 z, `3 k
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)# P. t# Y% |8 N2 e# h( t( x1 l
    {4 ~' O( _9 a( i* l- F8 G+ I2 U
            comp temp, xtimesy;8 D9 N" b: \; |. B! J7 _; w; Y/ g
            xtimesy.re = 0;
    5 m, _8 l8 D5 S5 n6 c3 U+ @3 k        xtimesy.im = 0;
    3 N% b: I1 i9 f9 g4 C2 C! v        int j0 = lenB - 1;: O/ j2 w1 N$ Y$ ]( u
            int    i, j, i1, reali;
    ! l  f4 u1 E5 m        if (lenA % 2 == 1)+ ?& m! C# k0 m
                    reali = lenA + 1;& a! m7 M: F7 S& S+ z: o* ~
            else
    5 h# r' H3 B" H, h, t                reali = lenA;9 O! `) I" k0 T( r6 \$ |; s
            reali /= 2;. V$ S4 a" t8 s, X8 _. F
    4 U* N% G# @7 W3 `9 o
            int nconv = reali + lenB;
    . G: }, K/ j8 m/ B        //#pragma omp parallel for( @( L. f1 N8 F! Z6 I) e: B+ s
            for (i = reali; i < nconv; i++)
    ! \- `3 A; r& `, j* S        {4 Q4 q% ^3 Q7 v1 f9 n
                    temp.re = 0;
    5 R8 j/ h- q: G; Y7 [                temp.im = 0;- P" G: m/ Q8 Y. Y
                    i1 = i;1 |' \' ]% m' n0 Z2 }
                    for (j = j0; j >= 0; j--)
    ) I+ j6 R: h1 @. {& Z6 R                {
    % z0 @' w! u7 _' ~, T7 y                        /* floating date operation */
    : j8 [* T) ~+ X3 n6 m2 ?( m                }
    " `3 T! b. M3 _2 O" y
            }
    5 V4 n# }6 }1 e+ }}
    % Q. s1 l4 s( A) T4 s1 |. Z1 U9 k; K) ]! Q6 M
    xcorr函数代码如上,comp是复数struct, 做过长度为11、19两个矢量的测试,和octave结果完全一样
    $ f# Z: |6 a5 A1 w
    / `. j$ @9 W) u红色部分是内循环,现在其内部操作都comment out 了, j0大概是 6000。
    # h# i4 o+ E8 E6 f0 m现在call xcorr 100次,耗时78s.& l% h3 q8 b2 ]
    + T7 }2 s- m; q. h$ Y+ _' o
    如果把红色部分内循环本身完全comment out, call xcorr 1000次,耗时 <1s.
    * b4 S6 d5 z, u- w8 q$ f& U, S( O
    回复 支持 反对

    使用道具 举报

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

    [LV.10]大乘

    6#
     楼主| 发表于 2022-9-25 00:17:17 | 只看该作者
    风雨无阻 发表于 2022-9-24 23:33; O/ F5 v& ^- h9 i6 }
    Maybe Debug mode?

    ! v4 M1 F0 ^7 r' h' d
    ! F! u. ^. F1 V不应该,看我上面的回复。
    9 _$ Q  s" y0 i! ?6 g  l+ Z  Q6 g
    4 h1 O( n6 g2 \) ?我更怀疑是 VS 社区版的问题
    回复 支持 反对

    使用道具 举报

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

    [LV.Master]无

    7#
    发表于 2022-9-25 00:20:10 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 00:24 编辑
    " M/ T/ r- z8 C4 `8 s8 w- h9 m
    雷达 发表于 2022-9-24 23:54* c4 ?( _5 P& ?3 m6 s
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)$ W& v+ c) O3 h' \2 ]5 n) ?
    {
    , f5 M" o" |; w9 c/ p        comp temp, xtimesy;

    + Z8 q# o# I3 [6 Y0 [+ ^' d+ w  U9 k, p: `0 u
    这个不是这么比的吧。。。: o& C+ w8 _, R. w$ c: p5 ]2 G( M* l
    + w" u8 k) ?# }7 y4 D* h/ Z% v, j5 M
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    5 I8 W. ^* K: `( p# i( d8 v$ |; 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 编辑
    & A4 K4 B3 |7 T( ?7 J
    数值分析 发表于 2022-9-25 00:20$ e* t1 ?* N% k7 r
    这个不是这么比的吧。。。1 h& P& u# @: v% i0 l( G0 {
    0 j4 Q1 e3 |& j; \' @' d, l; E0 b
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    # i2 U1 R1 H( c" T; ~$ m
    9 q. P5 S) j  A- N: C1 U
    有道理。
    " d- O- ~# u: Q1 u' [所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,记得 numeric 库里有算向量内积的,我回头试试。- o4 v" P$ Y5 ^7 f) P+ o9 V
    6 }( H4 y: h) y8 ?5 ]$ V
    我先尝试尽量用标准库,一个小程序,不想搞得太复杂。多谢了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    9#
    发表于 2022-9-25 01:27:53 | 只看该作者
    雷达 发表于 2022-9-25 00:46
    / l3 G; [1 s% Y* z: W* ~1 B" Y+ M/ o有道理。
    8 T& R% d) ~+ x) ]所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,这大 ...
    9 {: a( Z  S  o: _
    你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子,把循环本身翻译成机器指令loop或dec/jnz,两者速度上会差很多0 ]3 C8 u3 v+ }  [! c5 d
    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% \& W! D  t0 r8 z! g
    这个不是这么比的吧。。。
    2 w+ f5 U1 o! M/ J  e$ x( P! C$ V1 y  X1 E/ X
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    而加上内循环,光jmp和dec指令就至少多执行了6000个
    4 J% f  j- E  |( v. c) _

    ( q% w! W9 o' C6 |% X4 g+ H1 U; V现在的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 编辑
    $ P7 A- j: a& F
    沉宝 发表于 2022-9-25 01:48
    # h% s5 \5 H- \" L现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果 ...
    * ]' Y5 x0 k0 S% O0 R

    " ]$ z, W. h) o3 \/ |* I是的,兄台说的对。
    9 @! P! _) n! X' a0 X5 u
    8 F0 L# I& M) }9 ^; Y其实我想说的是 真正数值计算部分和代码中其他不直接计算的overhead的比值这个事儿。
    2 J* ~: P6 \, e3 O" e: T0 S* I3 O. J# |6 }
    雷达兄构造测试用例的时候,屏蔽掉了所有计算的部分,使得剩下的都是overhead,这样run time比较的结果就显得好像不合理了。如果把计算加回去,计算部分的run time会dominate,结果就不那么离谱了。因为不好说,所以用指令数对比的方式试图直观地说明这一点。8 F! J% @9 d3 c

    5 k$ w6 o& K6 {5 r比如说,如果有计算,那么跑六千个循环相对于计算应该用不了多少时间。但是如果一边是什么都不做,另一边是六千个循环,那六千个循环比什么都不做慢几十倍了,就不是那么不合理了。
    6 s  @4 }( {# h# ?2 }0 A" {( ?4 ?: C4 T% P6 A) [. |
    当然也有可能像兄台说的,是优化参数的问题,但我觉得更多地是测试用例设计的不合理。
    回复 支持 反对

    使用道具 举报

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

    [LV.10]大乘

    12#
     楼主| 发表于 2022-9-25 04:47:43 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 04:49 编辑
    6 Z! ?8 D( U0 e! B. O$ |7 I
    沉宝 发表于 2022-9-25 01:27
    - W/ j+ |( c8 W- n; S你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子 ...

    , i0 }' ], O0 ^- E( M9 r0 p# b, x2 f2 [+ [' D* W
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差一倍,我上面这个差的太多了。3 V2 b: n& ?0 V7 Z# d
    & D. z+ B" [: B0 J
    我已经完全懵了。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    13#
    发表于 2022-9-25 05:51:23 | 只看该作者
    雷达 发表于 2022-9-25 04:47+ G5 D& P" u1 ^5 W& l5 Q9 X6 N* h
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...

      w) m* g" A9 a9 D, q; Y" y- X时间差一倍的结果可以接受。% s# J; y4 w, u" K6 v, C% d0 K

    * b" n; n# d. @+ S8 R/ T# @你还是用profile工具看看吧。现在大家都主观瞎猜。
    回复 支持 反对

    使用道具 举报

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

    [LV.Master]无

    14#
    发表于 2022-9-25 14:58:59 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 15:38 编辑
    4 k  w# ?+ {  _4 L: i
    雷达 发表于 2022-9-25 04:47, P# g2 F& x  e) V/ o/ w
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...

    ! V% ]4 a3 K/ Z+ e0 c8 w1 B
    ' v! S9 d! n& o
    ) u" O4 s7 o% b' `0 i, k6 [+ C
    能不能把这个也贴上来,看看和上一个有什么不同?
    回复 支持 反对

    使用道具 举报

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

    [LV.10]大乘

    15#
     楼主| 发表于 2022-9-26 01:30:03 | 只看该作者
    本帖最后由 雷达 于 2022-9-27 01:17 编辑 9 Y( [3 N2 e' `4 j
    数值分析 发表于 2022-9-25 14:58
    ! J1 J* Q/ S4 m  s6 W( s2 o能不能把这个也贴上来,看看和上一个有什么不同?

    9 i/ @7 i9 b2 u7 N7 R理了理思路,重新做了一个测试。% A: |, ~8 B3 f
    做了两个 vector 和 两个 float *, 都长 100000
    + b, ?1 R" p' N外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
    " I/ k& g9 V# z# C. K2 s! c9 D+ D1 y' [! I5 o8 s
    内循环试了4种方法,
    2 |8 D$ Y* e2 m" d" B, U1. 直接调用 vector inner_product 247s . h0 M' H! u5 Z1 @* @/ @# O# ^  L
    2. vector 循环点乘累加 237s2 N! p, N2 ?, v! @7 u
    3. float * 循环点乘累加 204s8 e( V# g6 n+ y# u* B/ v$ _
    4. 空循环 100000 次 202s
    $ E/ y2 S* E6 w5 n, W9 V, Y0 P6 |1 T" M
    不做内循环 200s
    $ x5 q3 G2 j9 E3 B4 R5 }; w& |$ a! _6 w# Q
    你昨天说的对,内循环本身占比是很小的,大头在其他处理。
    ) n7 x" o- ]8 `9 }% q$ V- U2 T另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。  ~' ]: _) R7 K7 }* J
    , ]& q) _3 I0 n* a& n7 \/ o
    至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
    ) ~7 K% p/ N4 c' D& S
    ' D0 C/ I5 S) y) P(为什么下面我贴的  b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成  jj 好了,原来 方括号里的 i 是斜体标志  LOL)1 z6 A  V/ Q# n$ M3 q+ S
    - j  ]: a' X- a! a9 d1 l
            std::vector < float > vec1(N);! f0 x0 a& o9 V1 w; x4 n
            std::vector < float > vec2(N);
    + Z+ v, T$ ~% x5 Y# F' m: p        float* b1 = new float[N];
    4 p* C5 e5 f7 c; i0 }) f& L! ~  l        float* b2 = new float[N];
    * z7 I' [0 p& m0 l7 v! T# F" u. b# ?3 {& Z0 f/ d+ U
            for (int j = 0; j < 6000; j++)
    , L+ r$ D2 N9 }8 E6 W7 n+ }        {
    7 M. Y: k' D& c+ G4 P                std::generate(vec1.begin(), vec1.end(), []() {! l$ ]- I: t' f  a
                            return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;( O: A6 U7 C% w# {. L
                            });
    - V% T1 _8 ?! T- H  o/ z, w8 B' L' T5 l; b
                    std::generate(vec2.begin(), vec2.end(), []() {& K- @( G% m, a7 p0 F8 B9 [
                            return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;4 a% O: C4 c8 J% A! j" X
                            });1 q3 e& ]* `2 P7 t

    ; e7 H8 r/ c! o, m" S" D' M# u  Z                for (size_t jj = 0; jj < vec1.size(); jj++)# A6 V0 F- h4 b) S: x
                    {# e3 G, h9 H( n8 M6 E
                            b1[jj] = vec1[jj];
    * ~+ U  U- O9 D, X5 D                }' d- h* s' H7 V/ L# h1 w5 t; ~/ h. U
    3 R; g: E9 w/ C. p
                    for (size_t jj = 0; jj < vec2.size(); jj++)
    8 A& x! W; H# t  w4 D/ S% J7 Y                {9 P/ `; M% ?+ |/ a
                            b2[jj] = vec2[jj];# |2 ~5 H; t5 G6 m7 @" ]; P
                    }
    $ M& q1 n8 h$ e- T3 s; S1 W0 J) ?7 V
                    //Method - 1  N=100000 247s  , W9 P% O8 @  H
                    //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);7 X3 x. ?. m* o( }% y
                                    
    6 n( Y$ M6 \& F5 D3 E1 G. w                //Method - 2  N=100000  237s+ c7 v. v2 q) ?, c+ r$ G4 G
                    /*
    / L+ _$ M9 v' `; r9 K                for (int jj = 0; jj < N ; jj++)
    , Z) `5 `% y% [+ Q, z& A: V                {
    # S  z1 |0 u% W                        fresult += vec1[jj] * vec2[jj];; N) O. l7 N% I, w: U0 \) ]
                    }: u4 W. u+ T" L/ w
                    */
    % q/ p$ G( \  c. K2 ]! j, A# U                                ( |2 O$ @7 D; }. \! F# h5 w
                    //Method - 3  N=100000 204s
    $ F9 x4 R/ j" O; V9 L$ T; z% H& `                /*% S9 Z' a$ |9 z. X# T% H% s% o
                    for (int jj = 0; jj < N; jj++)+ T! d0 d% M3 Z8 L% [
                    {" B9 ^$ [6 {7 b3 l
                            fresult += b1[jj] * b2[jj];- d* R  L1 b3 h( _2 R
                    }) n6 p( o$ }% o" \: f; c
                    */
    " _  w3 ?+ v. w4 F: v& y; Z: M8 R/ M! _  ~2 e
                    //Method - 4   202s4 R! Y8 A  U  m4 P  v6 x5 c& x
                    /*
    ' k0 ?, R- M0 p- B3 }6 d6 M/ X                for (int jj = 0; jj < N; jj++)
    0 M+ q- i; S0 C                {9 X" [4 J* G9 O
                            
    - P% ~% S  p5 P0 g                }: s' k" {+ l7 N6 A- ^
                    */
    , X5 ]8 p' X( y) X3 L                //comment out all methods, N=100000  202s               
    ! S) [, n9 f% k" Z        }: B7 j5 |3 c2 k/ y6 W. D2 K
    ; O$ \* J4 M4 G& U0 }+ c7 G
            delete []b1;$ P1 h! q% q5 }4 n
            delete []b2;

    ( t7 C$ C/ X5 i, Q
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    16#
    发表于 2022-9-27 00:15:38 | 只看该作者
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?
    - @9 ?5 x9 C% g! S1 g2 Z9 Q/ I# Y$ ]) a% S& d$ n' y; F5 d4 C
    你第二个试验里面的j在循环里面又重新定义了啊,你确定真的跑了6000次?4 G7 l5 M7 D" P9 E% y  O7 p
    回复 支持 反对

    使用道具 举报

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

    [LV.10]大乘

    17#
     楼主| 发表于 2022-9-27 01:16:03 | 只看该作者
    机器猫 发表于 2022-9-27 00:15
    / ~4 e, Y% g* b2 D瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?
    , L; r1 n; {: f: ?. W
    # Q6 p6 a1 i3 E$ e" J/ ?. C你第二个试验里面的j在循环里面又重新定义 ...
    : ?2 O. w. |8 k; Z% G  w/ x4 [4 |$ ?/ l
    内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL
    ' w, h$ l) V8 q! G- s) h" u. @" s
    + Q' i# z2 _& U2 g! H7 ^* f不和它较劲了,瞎耽误工夫,我已经转到 ubuntu, 也准备顺便试试 avx2 向量化。
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    18#
    发表于 2022-9-27 02:06:58 | 只看该作者
    雷达 发表于 2022-9-27 01:16
    7 v8 z0 v$ E1 F' N( N5 X; M0 T8 c$ ]内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL: _; R" R- t0 X: ]  R

    5 Q) [8 q! `: c, A不和它 ...

    # L' d. J+ a8 L& ]9 d4 f& I/ h
    4 Q! k8 q- U/ ]+ A4 Q. ]不过可以试试我说的register变量。前一个试验j是混在一堆其它变量里一起定义的,很有可能是在stack上,这样内存读写会更多,要是再碰上每次都需要加载cache就更慢了。
    + l* f! p6 E& M0 [6 y后面一个是在循环那里定义的,说不定编译器就把它优化成register变量了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

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

    使用道具 举报

    该用户从未签到

    20#
    发表于 2022-9-27 20:29:50 | 只看该作者
    雷达 发表于 2022-9-24 23:54. a7 G$ a2 O  V- u1 Y
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)% L  M4 R% G! Y) e
    {
    7 W/ E* ?: T7 k  f9 y! k2 |        comp temp, xtimesy;
    # f1 i  n8 M; n5 Q" Z& N
    这个code里面如果Openmp没有被注释掉的话,那么temp那个变量应该是定义在循环里面,否则线程之间会存在争夺写入那个temp的风险。9 _" n" z  ^& A3 ]
    内层for循环如果没有内部操作的话,编译时应该被优化掉了,和你完全注册掉整个循环是一回事。可能你的编译设置没有打开优化?
    0 w3 @" m5 V3 m& _( [6 i7 ]VS社区版没有问题,我工作用的就是社区版,设置正常的话不会比商业版差。以前游说头头用Intel Compiler,他说不想花钱,而且差不了多少,就一直用到现在。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2026-10-5 13:54 , Processed in 0.073080 second(s), 19 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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