设为首页收藏本站

爱吱声

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2022-9-24 22:54:26 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
    C++ 比 Octave 慢好多,怎么破?  a& i5 W! C* X
    ) N9 k4 W5 M& T6 L( Y2 C
    自相关两层循环,内层循环涉及浮点数计算,试验了一下把内层循环内部全都 comment out 只留个壳子,  但空的内层循环本身就把速度拉下来了,看来问题并不在浮点计算。$ Z: C- f0 H7 S8 N/ Z: c: v
    & a' `6 h# S9 C( V- _7 l: K
    速度优化问题真的很有意思啊。
    . y* ^2 J2 G  Q, b" y  O
    + F: P! a  ^) T, x1 R# v8 f欢迎大家继续讨论

    评分

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

    查看全部评分

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

    [LV.Master]无

    沙发
    发表于 2022-9-24 23:04:16 | 只看该作者
    拉下来?拉多少?1 X! K- ~, ^0 Y0 ~( Z
    把代码贴上来看看?
    2 }$ y  y3 _+ V2 X( U) y' j. R/ p6 }% w9 H' 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 编辑 * H( r; l+ @- I2 ]% o
    数值分析 发表于 2022-9-24 23:04
    ( _4 N% p( K, ?  S" t+ L0 I拉下来?拉多少?
    " P7 M: F8 @9 Q$ W1 q) m: h把代码贴上来看看?

    ; B" W3 w( G0 A+ f$ y* P# H1 \; n9 S- f
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    6 h- l; ^: e: v- E{% R- R3 \, V. v0 V6 [) H  L1 G! j
            comp temp, xtimesy;, [3 w. E7 P3 m9 u+ S4 e
            xtimesy.re = 0;
    # q! d+ I7 |& |        xtimesy.im = 0;5 n2 j( Y  ]% T$ U5 L
            int j0 = lenB - 1;2 l$ X( c: n- u8 A9 Z2 p2 ]' {
            int    i, j, i1, reali;
    9 y6 n2 \( C' c        if (lenA % 2 == 1)
    # L/ j7 U5 o' Y4 _                reali = lenA + 1;1 }, ^9 v  t' O9 C: m6 z8 r
            else
    4 k9 m% }/ @) d( B5 s  Y$ y                reali = lenA;! t( ]4 k; l/ S, h# P7 I
            reali /= 2;
    3 [; x4 B2 I2 s+ r' o1 w8 ~9 e/ F, c  \: R; W  \
            int nconv = reali + lenB;# P  j2 v2 Y4 v: e' D6 v6 ]
            //#pragma omp parallel for' }) L8 y- A& v9 ?
            for (i = reali; i < nconv; i++)
    $ A3 O! B. s  }7 V' w) G        {$ ^1 s! ^* Q; K8 G' {
                    temp.re = 0;7 j: f. c6 g% |% n+ U
                    temp.im = 0;
    : h3 t% O: A9 W/ b0 [$ o. j* P0 [1 i                i1 = i;1 c( E( e$ J! `# j
                    for (j = j0; j >= 0; j--)
    , W5 Z+ ]8 e) r; S$ j: A                {" s% R6 O9 {* |, O! R& g
                            /* floating date operation */
    3 B7 v+ U2 P" U3 Z                }

    # L5 S; k$ R2 f3 c# K# B        }0 i+ ?8 E, J* `  h6 ~  M0 W4 ^5 h
    }( ]. J% f& f! n7 |  V1 v
    0 D2 ~* j  m/ T, a7 c) Z4 L
    xcorr函数代码如上,comp是复数struct, 做过长度为11、19两个矢量的测试,和octave结果完全一样
    # w+ k7 k- s* R* \; j4 }( @+ q. B2 ~; x* t4 ?' _, C) v5 q
    红色部分是内循环,现在其内部操作都comment out 了, j0大概是 6000。
    , ], E  I2 i3 o4 b( x现在call xcorr 100次,耗时78s.
    0 k' ?; g3 _- k0 r5 C( T; |* N, b; M  U% D2 \6 V
    如果把红色部分内循环本身完全comment out, call xcorr 1000次,耗时 <1s.
    1 S& q; W# D. S4 z4 i9 p' d
      F, Y. M  ?6 `+ L6 I
    回复 支持 反对

    使用道具 举报

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

    [LV.10]大乘

    6#
     楼主| 发表于 2022-9-25 00:17:17 | 只看该作者
    风雨无阻 发表于 2022-9-24 23:33
    + j9 C% [/ p; U; ~0 O8 FMaybe Debug mode?
    & ?4 g6 Z0 p$ _. b& x' S2 K* p% D; x
    1 a4 Q( j" D5 ^# I
    不应该,看我上面的回复。. D5 n# h1 f$ p7 y4 j: ]- j

    3 m( g+ {/ c/ n& P0 _我更怀疑是 VS 社区版的问题
    回复 支持 反对

    使用道具 举报

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

    [LV.Master]无

    7#
    发表于 2022-9-25 00:20:10 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 00:24 编辑 " E' n- b& ~$ ~2 m' l. F; q
    雷达 发表于 2022-9-24 23:54, R2 J- E/ Q# P- T( D5 s* v- _
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    " {8 j- X; q- t9 d{9 X* u+ C* @0 \) ^  @' f- |
            comp temp, xtimesy;

    - L$ w; F. {* ~% ?# q/ J7 i
    3 m# M; X: Q7 D4 a这个不是这么比的吧。。。
    6 Q/ V! a  u( ?. u
    : v' N9 p$ y# D( b2 f您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。5 l$ ]7 ]8 n5 s0 @# Y4 P

    5 j" H; }+ T: R! I( m而加上内循环,光jmp和dec指令就至少多执行了6000个,慢个几十倍不是正常的么?
    回复 支持 反对

    使用道具 举报

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

    [LV.10]大乘

    8#
     楼主| 发表于 2022-9-25 00:46:56 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 01:09 编辑   |. u/ m9 q* M
    数值分析 发表于 2022-9-25 00:20
    * [' F: P; z  C0 v& s1 U9 l这个不是这么比的吧。。。
    # d  `5 \5 d# Z  J
    / A9 w, u" A4 w8 D您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。

    * y1 L2 z) J7 f1 r- R1 @, Z4 h# P% V3 b# ]
    有道理。. t, t: m6 }" y* j5 M' p4 S
    所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,记得 numeric 库里有算向量内积的,我回头试试。3 i/ v3 F6 C5 E9 ]. y

    3 P% U* ~  y6 Z) g我先尝试尽量用标准库,一个小程序,不想搞得太复杂。多谢了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    9#
    发表于 2022-9-25 01:27:53 | 只看该作者
    雷达 发表于 2022-9-25 00:46
    $ N3 l0 @' U7 J# O' V有道理。
    ; L7 l6 a' F) I8 i. {2 n所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,这大 ...
    ( z- O5 |6 r* c1 B' g( B4 d
    你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子,把循环本身翻译成机器指令loop或dec/jnz,两者速度上会差很多
    3 |6 _  }2 k% l; Y: _Why is the loop instruction slow? Couldn't Intel have implemented it efficiently?
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    10#
    发表于 2022-9-25 01:48:51 | 只看该作者
    数值分析 发表于 2022-9-25 00:205 n% s2 |- T8 H2 x
    这个不是这么比的吧。。。- W2 N; H  p8 {4 b, G  a

    5 j* P5 T0 a+ c您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    而加上内循环,光jmp和dec指令就至少多执行了6000个
    5 L; X  b9 Y6 T+ M
    ( e. |( ~/ F+ Q/ E3 |1 h( W: A
    现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果循环这样跑,花不了多少时间。
    回复 支持 反对

    使用道具 举报

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

    [LV.Master]无

    11#
    发表于 2022-9-25 02:06:44 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 02:16 编辑 ; X  z" |: e8 _$ c/ _
    沉宝 发表于 2022-9-25 01:489 R9 h* A( w' o& o0 j
    现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果 ...
    2 `7 z* ]2 V; B* S0 q

    4 j/ w, w% y& \: ~" v; X是的,兄台说的对。# ^4 A2 ~+ H6 V$ Z5 u
    7 e' r$ `; Z- V/ ?. p. I  g8 b
    其实我想说的是 真正数值计算部分和代码中其他不直接计算的overhead的比值这个事儿。
    4 d5 v4 {7 U( `9 D
    7 T* ^  _, P: B. W0 n6 O6 L, `6 w雷达兄构造测试用例的时候,屏蔽掉了所有计算的部分,使得剩下的都是overhead,这样run time比较的结果就显得好像不合理了。如果把计算加回去,计算部分的run time会dominate,结果就不那么离谱了。因为不好说,所以用指令数对比的方式试图直观地说明这一点。
      J, I2 }' h* ^( P* y
    . w/ `' k( q- @' b- X9 y, C% Z比如说,如果有计算,那么跑六千个循环相对于计算应该用不了多少时间。但是如果一边是什么都不做,另一边是六千个循环,那六千个循环比什么都不做慢几十倍了,就不是那么不合理了。/ O2 |! ]% ~1 c% b5 x
    ) D( m2 K. {& f) \
    当然也有可能像兄台说的,是优化参数的问题,但我觉得更多地是测试用例设计的不合理。
    回复 支持 反对

    使用道具 举报

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

    [LV.10]大乘

    12#
     楼主| 发表于 2022-9-25 04:47:43 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 04:49 编辑 3 E' m. P8 k: q/ \5 ~/ G5 O) l
    沉宝 发表于 2022-9-25 01:27
    $ B' f5 ^, Y: Z' V) O你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子 ...

    : Y, A. N- C6 Y+ q& m! U- W8 d, `8 ^3 [  n0 g3 h, w
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差一倍,我上面这个差的太多了。: [1 S8 i, y1 j  J5 {; [6 y* I& y
    ) |' z0 Y: V1 c# m/ [+ h
    我已经完全懵了。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    13#
    发表于 2022-9-25 05:51:23 | 只看该作者
    雷达 发表于 2022-9-25 04:47
    4 I7 A/ b8 |" p; |又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...

    % i& r3 L* A5 O* j9 ^时间差一倍的结果可以接受。
    : T: x6 a! _  V, P7 G
    % ]% K# l3 \+ ~; c7 \; e你还是用profile工具看看吧。现在大家都主观瞎猜。
    回复 支持 反对

    使用道具 举报

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

    [LV.Master]无

    14#
    发表于 2022-9-25 14:58:59 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 15:38 编辑
    - j; z, @/ c% `$ X+ [! b$ `
    雷达 发表于 2022-9-25 04:47; f+ r' h0 @8 G
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...
    / x8 l- Y# |$ d4 m' L" i+ e

    - _# k. n" o+ R6 W
    7 h4 ~1 p$ ~2 B. H  c1 ?. N; \) g
    能不能把这个也贴上来,看看和上一个有什么不同?
    回复 支持 反对

    使用道具 举报

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

    [LV.10]大乘

    15#
     楼主| 发表于 2022-9-26 01:30:03 | 只看该作者
    本帖最后由 雷达 于 2022-9-27 01:17 编辑
    ! x4 }: c: v  _, i
    数值分析 发表于 2022-9-25 14:58
    6 x5 t* v; C. }6 p能不能把这个也贴上来,看看和上一个有什么不同?
    4 D% Z- l' n+ L& f5 G: ]- p
    理了理思路,重新做了一个测试。
    ' \) Q: ^3 c4 r6 |* n8 U5 U8 W做了两个 vector 和 两个 float *, 都长 1000001 g* n/ x0 t3 U$ G. t% C
    外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
    7 _& {9 K) V7 L, }2 O; }0 R* Z" \# W
    / P% r$ i/ @5 D2 L* _7 F/ U9 p内循环试了4种方法,
    5 j# q. Y2 j8 S$ h5 O1. 直接调用 vector inner_product 247s % h# S! E" c: \, L. Y% d4 u1 L
    2. vector 循环点乘累加 237s, O. u) }8 i# P
    3. float * 循环点乘累加 204s
    8 @' p5 h0 V7 m" O" @1 [* g! r4. 空循环 100000 次 202s1 x- D& y4 V. O" ^
    * K$ K0 g" r( J% P
    不做内循环 200s
    1 w  l5 C- m" A8 c6 _7 {# u+ I- b5 q+ p( q. F4 u9 n
    你昨天说的对,内循环本身占比是很小的,大头在其他处理。3 R  \: v) h* D
    另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
    , T4 e% v' b. s: u3 [% R
    " p5 H; i) b- U6 F" x1 u至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
    4 v4 K1 A& l' j/ ?7 ?5 g; c
    ) |* {0 o: r, q  ^3 i(为什么下面我贴的  b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成  jj 好了,原来 方括号里的 i 是斜体标志  LOL)
    ) ?; P" e$ ]" [+ j; B! X+ a3 U: h- `& J' ~6 X" u# S" p1 ]* j
            std::vector < float > vec1(N);9 s3 o; B! N3 n0 V* t+ [/ U% [
            std::vector < float > vec2(N);
    ; |* g( y/ f% q  j6 _# O        float* b1 = new float[N];6 G  b6 u$ `) \, v9 M' }: L
            float* b2 = new float[N];
    8 Q/ |7 y+ d7 P. y$ d+ s8 u. P) c9 d
            for (int j = 0; j < 6000; j++)4 S. U! c& f" z8 Z. \$ t
            {3 O) s7 b+ v. P. f( N4 s2 }. O7 a
                    std::generate(vec1.begin(), vec1.end(), []() {
    ( l' z& }" [- c! J  z                        return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;! \7 Y. ]# A" g, s+ N6 E' a
                            });* w$ R' @. C9 ~
    8 s0 J! J' d& V$ n3 `( Y
                    std::generate(vec2.begin(), vec2.end(), []() {' {0 `! s- G0 ^( Z3 @1 ]! z
                            return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;$ Z3 T5 Q6 Y9 ^9 {9 g, U- f
                            });/ @; ]3 ?  J8 L+ k5 q  h& H  V

    ( H4 t$ c- u# _1 G                for (size_t jj = 0; jj < vec1.size(); jj++)' s) R9 T- V& p1 E# C9 F
                    {1 x3 Z/ v  x1 B' t
                            b1[jj] = vec1[jj];: Y2 _% n6 A' Z6 `4 d1 R# J7 V
                    }  n+ m# ^: I: g* E- e! T! \0 u* D' a2 Y

      e+ A1 W% U; \: f* s                for (size_t jj = 0; jj < vec2.size(); jj++)
    1 J: |/ F. o( x0 Q6 ~2 |                {7 Y' q8 r5 `+ y! Q: _
                            b2[jj] = vec2[jj];
    9 i7 }+ {7 ]+ N3 u3 h                }
    : w* X3 P: b- T/ n/ L& [
    / b5 c& R5 [, p4 F; k8 T( ~4 Z                //Method - 1  N=100000 247s  
    8 D' s6 T4 W) V9 s1 b+ A7 z                //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);2 ~! h& T7 N1 g( B: @) i8 \8 H
                                    + f& ?; T7 q: {% l1 ]" _
                    //Method - 2  N=100000  237s
    - Q: r! B) m0 ^/ S' p1 L                /*! z# d1 k: Z5 X% \4 G: _
                    for (int jj = 0; jj < N ; jj++)
    6 U6 U0 B% ]! A" J2 X                {# a/ I6 U. v# T. U
                            fresult += vec1[jj] * vec2[jj];4 J8 d; Q5 ?1 q
                    }
    1 I9 }  f  D/ O3 n' V                */( W7 S% y! L6 t" ~0 f
                                    
      ?; x  _" F3 b* r8 `, ~2 a                //Method - 3  N=100000 204s  Y# L7 f& e$ l4 z9 k
                    /*# K$ H  J' B: K
                    for (int jj = 0; jj < N; jj++)
    + _/ w8 f* a4 V3 ^. ^                {
    ( `! A% f$ C. Y" s8 `* P" B: M! k                        fresult += b1[jj] * b2[jj];: R* j" @$ y1 Y2 O* R4 X2 f0 V
                    }% g" j8 }. L3 @. m8 J
                    */
    $ N- o$ D; _# H- z# c; h+ t; s+ x$ X7 C7 C7 I
                    //Method - 4   202s+ x! o' _$ L% g2 o3 v  b) L
                    /*. k0 {& X  i* J7 z: V
                    for (int jj = 0; jj < N; jj++)
    + q3 ]# @' H, l                {
    3 T0 X( {/ N' m2 x                        : H( j, }7 D  J5 _9 u' c9 }
                    }& l, |) v& j; R' s. O
                    */! j7 y* }: ^  |7 @3 l) ]
                    //comment out all methods, N=100000  202s               
      r$ p' j/ F% Z$ \; V        }
    0 d& F. |5 u, y
    0 T' I! u$ D$ ~3 {        delete []b1;
      @) F( }* V( |/ i        delete []b2;

    ) o; Z: j2 y. n: O
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    16#
    发表于 2022-9-27 00:15:38 | 只看该作者
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?
    ' A8 H- I0 z# G4 D( u& M6 ?/ a9 ]" _  |  k* w; c
    你第二个试验里面的j在循环里面又重新定义了啊,你确定真的跑了6000次?! Y9 A* I8 [; E
    回复 支持 反对

    使用道具 举报

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

    [LV.10]大乘

    17#
     楼主| 发表于 2022-9-27 01:16:03 | 只看该作者
    机器猫 发表于 2022-9-27 00:15
    $ u8 Z, P; L7 ?1 `瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?. M/ w% d! D: `& `

    8 H2 @9 ^; f5 x, C你第二个试验里面的j在循环里面又重新定义 ...
    & N) X# `7 B2 {& L: w! K
    内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL
    # s) }, C  l( t
    + p  m# t! ~; A* T$ T不和它较劲了,瞎耽误工夫,我已经转到 ubuntu, 也准备顺便试试 avx2 向量化。
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    18#
    发表于 2022-9-27 02:06:58 | 只看该作者
    雷达 发表于 2022-9-27 01:16/ r4 F; D2 i. A' N/ k
    内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL
    + \0 w1 [/ ^) k. b' E9 b& X, i3 w/ P3 m
    不和它 ...

    9 }* i* ~8 x* C+ p/ E$ {9 K' ?. @2 S% v& s' X! W3 ]; o5 y
    不过可以试试我说的register变量。前一个试验j是混在一堆其它变量里一起定义的,很有可能是在stack上,这样内存读写会更多,要是再碰上每次都需要加载cache就更慢了。1 L9 O: R) N+ }, Z; C! H
    后面一个是在循环那里定义的,说不定编译器就把它优化成register变量了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

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

    使用道具 举报

    该用户从未签到

    20#
    发表于 2022-9-27 20:29:50 | 只看该作者
    雷达 发表于 2022-9-24 23:54
    / V, I5 ]" X9 S  V8 Uvoid xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    ; z, y" Y5 G  M4 T* _7 q{4 @# W" G: }  Z
            comp temp, xtimesy;
    3 f5 |% t3 V3 f. i2 v9 c
    这个code里面如果Openmp没有被注释掉的话,那么temp那个变量应该是定义在循环里面,否则线程之间会存在争夺写入那个temp的风险。
    2 O- v$ z  }7 [* P8 ~: c内层for循环如果没有内部操作的话,编译时应该被优化掉了,和你完全注册掉整个循环是一回事。可能你的编译设置没有打开优化?- J0 s' B" q0 J) g( m2 {4 D" f. V
    VS社区版没有问题,我工作用的就是社区版,设置正常的话不会比商业版差。以前游说头头用Intel Compiler,他说不想花钱,而且差不了多少,就一直用到现在。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2025-4-4 08:43 , Processed in 0.042852 second(s), 19 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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