设为首页收藏本站

爱吱声

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

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2022-9-24 22:54:26 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
    C++ 比 Octave 慢好多,怎么破?) Z5 m: g+ `9 o" g3 e
    " N% L1 j* {% j
    自相关两层循环,内层循环涉及浮点数计算,试验了一下把内层循环内部全都 comment out 只留个壳子,  但空的内层循环本身就把速度拉下来了,看来问题并不在浮点计算。" |% u. X  M) }  V$ [& r
    % @6 o; c! s/ q1 k, v8 G' K
    速度优化问题真的很有意思啊。, P- h$ j+ v* ^8 x1 b
    ( k6 k  x' d# H
    欢迎大家继续讨论

    评分

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

    查看全部评分

  • TA的每日心情
    开心
    2025-10-27 04:12
  • 签到天数: 1953 天

    [LV.Master]无

    沙发
    发表于 2022-9-24 23:04:16 | 只看该作者
    拉下来?拉多少?: x3 `* p& \, h4 e' [0 j: Q/ |
    把代码贴上来看看?
    % c7 K- y( I9 U% V6 e. b  [4 w( e, a1 q' ~
    难道分支预测不准破坏流水线执行?不该啊。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    板凳
    发表于 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 编辑
    # t) |" n% n& T) J/ Q
    数值分析 发表于 2022-9-24 23:04
    ; o" n; ^1 w, ?) P2 o# l/ l拉下来?拉多少?6 j) J( V. H, z4 ]: `
    把代码贴上来看看?
    8 f! j$ w# ]9 ]% y6 q

    9 p5 ^9 ?+ O0 p% R4 nvoid xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)( X2 F  A5 u  j) E: @& D
    {
    6 g3 a) {) m. l# ]0 r1 U6 A        comp temp, xtimesy;
    4 p: r; R: v1 d        xtimesy.re = 0;/ w5 A: A7 G+ I: f" \) t: t
            xtimesy.im = 0;. B+ J. k0 |. ~. R# W; Q
            int j0 = lenB - 1;
    5 K9 H! P/ r( d% |        int    i, j, i1, reali;
    * `( b  L( j) `, K6 Y" u        if (lenA % 2 == 1)
    3 }3 _" e7 ?$ e% i; B( J' I) n                reali = lenA + 1;
    2 M2 c' m" D7 q        else
    ; n4 G; b2 O1 q8 W# |; V9 R                reali = lenA;( K" R5 q7 M/ I; j5 a( s: H
            reali /= 2;
    ' A, S3 Y4 ]" p. A: Y
    % i( A7 d/ j" h( }& k        int nconv = reali + lenB;
    # A0 D& G. d  |$ P+ X        //#pragma omp parallel for
    9 u9 _+ U% e6 j8 [1 Z/ a        for (i = reali; i < nconv; i++)# b+ U# u" ?! Q) V( ~
            {- v& U4 Q4 x7 f- q( s8 _, L; r
                    temp.re = 0;
    ; x+ B. D: [1 t: P) h. A                temp.im = 0;. B; I2 V9 M% j$ }3 h; |
                    i1 = i;
    5 O# a2 n. C/ ]3 x  T; S                for (j = j0; j >= 0; j--)9 r+ B  ^( c7 x* v7 e/ Z/ t$ R
                    {! J! J0 E$ K; q( D
                            /* floating date operation */
    $ B# l7 u- K3 m                }

    , D! |% ^: m5 A        }, z, C# p8 o' D- |2 `
    }$ c% h. x7 M! n4 l2 U

    9 T$ b5 y6 }2 Yxcorr函数代码如上,comp是复数struct, 做过长度为11、19两个矢量的测试,和octave结果完全一样
    2 w, x  m. {. M* {# Z8 K9 j1 C8 h8 |# w( E: n
    红色部分是内循环,现在其内部操作都comment out 了, j0大概是 6000。
    " C9 a6 I# ~- Z现在call xcorr 100次,耗时78s.  N  B9 i5 X, D

    ( d& Z# N; t: ^4 k* ]; f" P, u如果把红色部分内循环本身完全comment out, call xcorr 1000次,耗时 <1s.
    / H+ E5 |. M4 |: y
    ( Q! R2 ?! x0 t) p% o
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    6#
     楼主| 发表于 2022-9-25 00:17:17 | 只看该作者
    风雨无阻 发表于 2022-9-24 23:33" R! f& U7 b6 B# A* Q* S
    Maybe Debug mode?
    1 K9 M# k% {, ]
    ; ^, p2 f6 \% @# X
    不应该,看我上面的回复。" i) U4 a7 Z/ s6 ]5 x; n2 W

    8 j& O& ]- l/ ^+ I我更怀疑是 VS 社区版的问题
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2025-10-27 04:12
  • 签到天数: 1953 天

    [LV.Master]无

    7#
    发表于 2022-9-25 00:20:10 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 00:24 编辑 - }1 O3 E, ]3 v+ ^, n+ a1 ]: |
    雷达 发表于 2022-9-24 23:543 M  \, ^* s0 ^6 Y. G3 |
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    ; g6 p# T9 a9 @; _, \! Q' B{) T1 X7 l  Q% H7 S# T
            comp temp, xtimesy;

    & b1 |5 p- U, M9 i" m9 f: P4 _# i! W7 j( C* Y, w, W
    这个不是这么比的吧。。。/ I( n' R& l# {9 D, J
    ; j, Z( R+ f5 X( U) y( q
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。, m% M. j# K2 y
    * V0 D! z# ], f7 v& L
    而加上内循环,光jmp和dec指令就至少多执行了6000个,慢个几十倍不是正常的么?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    8#
     楼主| 发表于 2022-9-25 00:46:56 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 01:09 编辑
    . u- b, k  [- L/ z! Y* K6 b; t
    数值分析 发表于 2022-9-25 00:20& j; \0 b8 I+ _" J" _/ n8 P6 M
    这个不是这么比的吧。。。
    5 o8 O9 k8 C: o6 v# Q2 m. ^, \% I8 \% j2 @5 p* B- c
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。

      w- d% d6 v5 _- j- L0 |
    5 h' K, x5 H" [8 [. M" q5 l8 G有道理。, J: Q0 P) t, J% s/ {; U
    所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,记得 numeric 库里有算向量内积的,我回头试试。9 C0 k6 v( P, B- F% ~* q/ [
    & K* _9 \  N* c' i& P' Q1 B
    我先尝试尽量用标准库,一个小程序,不想搞得太复杂。多谢了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    9#
    发表于 2022-9-25 01:27:53 | 只看该作者
    雷达 发表于 2022-9-25 00:46  _/ I$ k& H) }  @  }
    有道理。
    ) b! x3 Z# P9 L# x- s所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,这大 ...
    1 [8 A8 I- p* P) L4 v3 }
    你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子,把循环本身翻译成机器指令loop或dec/jnz,两者速度上会差很多* L* {. M% o: f* I/ l. ~
    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
    + J" L9 W8 Y! _0 i) B这个不是这么比的吧。。。
    ' ]" C" e; Q) I# i$ k
    3 J8 P$ ^8 ?" r7 w. G您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    而加上内循环,光jmp和dec指令就至少多执行了6000个

    ; w% h8 N, F4 \5 Y9 T! R
    + T% h; i, H# ?: }现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果循环这样跑,花不了多少时间。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2025-10-27 04:12
  • 签到天数: 1953 天

    [LV.Master]无

    11#
    发表于 2022-9-25 02:06:44 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 02:16 编辑 , i5 B- e) q8 k- D! K  {& `
    沉宝 发表于 2022-9-25 01:48
    2 p5 e' D  v/ M- A现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果 ...

    2 f: l+ I; h- M% c( w
    # t$ C/ V8 g3 f: h% {0 B1 n是的,兄台说的对。
    ; i2 b" Z# u) E9 L6 |; Q  I, V3 z# u/ B* d0 {. O
    其实我想说的是 真正数值计算部分和代码中其他不直接计算的overhead的比值这个事儿。' c6 g! }$ S4 Y0 p$ o8 `* [# w1 ?
    8 X" O" S) Y" b) n
    雷达兄构造测试用例的时候,屏蔽掉了所有计算的部分,使得剩下的都是overhead,这样run time比较的结果就显得好像不合理了。如果把计算加回去,计算部分的run time会dominate,结果就不那么离谱了。因为不好说,所以用指令数对比的方式试图直观地说明这一点。- a. q  A7 ^) K: V6 g' S
    : ^0 K3 _2 v: }2 X' Q! B
    比如说,如果有计算,那么跑六千个循环相对于计算应该用不了多少时间。但是如果一边是什么都不做,另一边是六千个循环,那六千个循环比什么都不做慢几十倍了,就不是那么不合理了。0 h( O: h/ K0 R8 N
    ! x5 N. P4 @* K0 R% J1 k" V
    当然也有可能像兄台说的,是优化参数的问题,但我觉得更多地是测试用例设计的不合理。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    12#
     楼主| 发表于 2022-9-25 04:47:43 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 04:49 编辑 + h, E8 ^" b0 p3 Q7 S$ [/ {  ]
    沉宝 发表于 2022-9-25 01:27
    2 i1 ^# R5 Y1 C2 Q你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子 ...

    - k, ~7 P. U0 t0 ?. M& M* [. H* f% T/ w* `( J& v9 d) u
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差一倍,我上面这个差的太多了。
    ; v$ O2 G* ^; s/ }' _1 T& Q: j+ D8 c
    我已经完全懵了。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    13#
    发表于 2022-9-25 05:51:23 | 只看该作者
    雷达 发表于 2022-9-25 04:47% ?* w1 A( W1 P7 W0 T4 b
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...
    ! S3 E' I" z  q! H" Y
    时间差一倍的结果可以接受。& C1 }* e# g; P* [

    0 h0 s2 a; A, \你还是用profile工具看看吧。现在大家都主观瞎猜。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2025-10-27 04:12
  • 签到天数: 1953 天

    [LV.Master]无

    14#
    发表于 2022-9-25 14:58:59 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 15:38 编辑
      w8 @4 ?$ V" t& \7 o4 l& l  O
    雷达 发表于 2022-9-25 04:47, d; o+ A6 J6 I7 s3 h3 L8 k
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...
    ; p( X; u' z: \! g1 {" R1 V
    ' t& w4 d. N8 M: b9 J8 \! Y# ^
    * Z% L# M7 Q" d2 p0 J( C% D/ M9 H
    3 J! ^0 m" q! s" q! C
    能不能把这个也贴上来,看看和上一个有什么不同?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    15#
     楼主| 发表于 2022-9-26 01:30:03 | 只看该作者
    本帖最后由 雷达 于 2022-9-27 01:17 编辑
    + C# R: ]: f5 k* m( N5 S
    数值分析 发表于 2022-9-25 14:58! b7 H1 E6 \+ e) T8 C5 ?
    能不能把这个也贴上来,看看和上一个有什么不同?
    7 y4 R: A) C( H
    理了理思路,重新做了一个测试。4 _7 l& y- F9 ], ]) `
    做了两个 vector 和 两个 float *, 都长 100000; N( j! q" Z$ R3 r/ p
    外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.: q+ I; E$ m2 i6 z. z3 b1 u

    8 ^; d6 w5 w) v5 Q  ^( `2 A# n内循环试了4种方法,
    # S/ k( [$ _4 O2 x; J$ U& C1. 直接调用 vector inner_product 247s
    , i1 g, p/ h# K, \7 T. `2. vector 循环点乘累加 237s# m) k$ A  `- K: V, `
    3. float * 循环点乘累加 204s9 X* H- C* v) x! T
    4. 空循环 100000 次 202s
    . r& ^. |7 K0 L# D, C* ~: h& j( |, @/ i- b7 Z- y/ q: s7 a( P
    不做内循环 200s  Q* X5 d* L" w; p4 J2 P; Q: j

    # F" ]( w$ w) ]. ?. Y+ _% m4 G你昨天说的对,内循环本身占比是很小的,大头在其他处理。
    2 E, Y0 [3 x1 m5 h另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
    " m/ ~! J& }9 R  d7 ^
    - f) F+ B. h  j( ]$ a至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)3 P. y4 M2 Y0 r3 d0 i

    * a5 J8 S! i+ \* h: S(为什么下面我贴的  b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成  jj 好了,原来 方括号里的 i 是斜体标志  LOL), J/ A' R% k9 j

    6 }+ W8 Z( Q/ l
            std::vector < float > vec1(N);
    7 m5 L( a: S7 Z% j; ~1 U5 v        std::vector < float > vec2(N);
    " X" m5 p( W) [- p; ]% W        float* b1 = new float[N];
    5 I9 |& a, @0 v        float* b2 = new float[N];
    % C/ z9 r% g# [# o$ e! X' L4 a/ W( e% O2 E# P* A2 F2 H
            for (int j = 0; j < 6000; j++)/ ^) w! J0 H9 a7 f3 l$ k; k
            {" l2 M# b6 y" `" }# E' c
                    std::generate(vec1.begin(), vec1.end(), []() {. }% L/ e- ~$ }  F9 \
                            return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;  c  S" c+ y8 R5 K
                            });
    0 V1 }4 R- V6 H3 N5 d) C+ J1 ?+ X5 i2 }) S$ Z4 u7 _1 |
                    std::generate(vec2.begin(), vec2.end(), []() {
    , b/ a( \+ `6 j5 q% i                        return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;+ b( |) |1 X2 A
                            });9 o3 J& f% w6 ]9 E5 ~
    5 U# A5 ^2 D7 r# s( J) n) w, T
                    for (size_t jj = 0; jj < vec1.size(); jj++)
    ) f8 M( K( X' _                {3 ^+ y. J, L& b8 j, a: R% ]" b5 b6 c
                            b1[jj] = vec1[jj];# ~3 J( a) V/ L1 S8 ], x3 }
                    }2 l  C! v1 K$ w1 f. N9 T4 B/ ?1 x8 |
    / ]& E8 C6 y1 V; B7 V
                    for (size_t jj = 0; jj < vec2.size(); jj++)
    6 D9 s3 S  j' S& U( x                {
    # }  E7 c6 X1 F, M                        b2[jj] = vec2[jj];0 ?) \$ @# I/ }& g2 M% O/ H  A
                    }
    2 [) ?' {( |. c& B( L4 P
    8 {7 s: V) ~7 H8 }( B' x! P. c& P- x                //Method - 1  N=100000 247s  
    2 a( M9 t7 n( Z0 T) O                //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);4 @3 b8 i, L9 P1 J7 ~
                                    
    # J4 T" j6 Q, b) f' i3 P) p% R                //Method - 2  N=100000  237s
    1 v, V2 U% F& I4 H                /*7 r0 J- n$ D" G9 X2 I. R& W
                    for (int jj = 0; jj < N ; jj++)
    " M  ^" q, x; U: j" l                {
    + \# @2 D6 N7 M& Q, K                        fresult += vec1[jj] * vec2[jj];
    ! w4 n8 J, O9 J5 Z' k                }
    " D' d5 z- X: E3 _! S                */" [- ^+ M! G9 w: L; T4 n
                                    
    0 K# `( |: D% \. y7 H$ W* Y! [                //Method - 3  N=100000 204s/ W9 f- h9 i+ Y  a
                    /*$ k! \6 U$ k: l# g
                    for (int jj = 0; jj < N; jj++)
    * z7 m. \& J) I6 [! J0 l, l                {% C7 m; m" M1 O3 N+ O+ C  I
                            fresult += b1[jj] * b2[jj];* Y& s+ h; D/ Q/ @5 l5 p
                    }* Z3 q. f- \0 t8 A
                    */
    " |# ~6 F9 a/ N9 k& ]! e2 F1 _* D
    - n- e" p/ C7 [+ C3 y: y                //Method - 4   202s
    1 c# M/ @4 ]" g$ `' D                /*) m/ M" m: g* F$ ]
                    for (int jj = 0; jj < N; jj++)
    1 S$ p5 j9 j6 S5 C8 H, \                {0 b0 K; l. J0 Z. P& x' @( ~
                            
    ; W, h* `* w: W; v' \5 ]                }0 a; _) t% C3 b3 }' t" A
                    */$ `8 G2 ~" Q- `0 z
                    //comment out all methods, N=100000  202s                ( L* P, r* j4 F$ x! P
            }
    ( ]( J) x% T( T7 L3 N7 F# b
      L$ h+ O$ c. R3 s        delete []b1;  I4 b3 M& j5 \( ~& O* [
            delete []b2;

    . {; U0 e7 r5 F# Q
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    16#
    发表于 2022-9-27 00:15:38 | 只看该作者
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?5 e+ g# m- {. V& d) ?) w7 }- G3 ?
    9 B% A4 n& S. c2 y% v" O7 Q
    你第二个试验里面的j在循环里面又重新定义了啊,你确定真的跑了6000次?+ V6 z# d2 g$ N: W" a- e+ z# C6 Q
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    17#
     楼主| 发表于 2022-9-27 01:16:03 | 只看该作者
    机器猫 发表于 2022-9-27 00:15
    $ t  [  h; J4 O* F瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?
    9 A# x5 Q% ?2 Z5 L
    2 G/ M3 d. w8 U8 B- [& s0 {3 \你第二个试验里面的j在循环里面又重新定义 ...
    ' S9 n1 _$ s4 h! ?
    内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL
    ) I0 l6 E- }' c
    , X: J$ D$ H/ L6 I) Q+ |) O不和它较劲了,瞎耽误工夫,我已经转到 ubuntu, 也准备顺便试试 avx2 向量化。
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    18#
    发表于 2022-9-27 02:06:58 | 只看该作者
    雷达 发表于 2022-9-27 01:16' b) }" w1 h( g/ ]8 m" w. J
    内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL5 ]% E3 J: N* R
      n, o/ R2 S8 e: i% h5 d" q$ H
    不和它 ...

    5 R9 J" I* U8 y% L% a  K# Y" ~, S  k; `
    不过可以试试我说的register变量。前一个试验j是混在一堆其它变量里一起定义的,很有可能是在stack上,这样内存读写会更多,要是再碰上每次都需要加载cache就更慢了。
    8 P6 H- a; Y* J5 z/ G+ |# L后面一个是在循环那里定义的,说不定编译器就把它优化成register变量了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

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

    使用道具 举报

    该用户从未签到

    20#
    发表于 2022-9-27 20:29:50 | 只看该作者
    雷达 发表于 2022-9-24 23:54% u! c2 u& N6 P$ V
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)5 {+ `* p9 h5 V2 T* C, a
    {, T; V9 h- d5 h7 A( o( i, B) Q4 K
            comp temp, xtimesy;
    5 ^% |' R2 }+ V1 m: B% n  U
    这个code里面如果Openmp没有被注释掉的话,那么temp那个变量应该是定义在循环里面,否则线程之间会存在争夺写入那个temp的风险。
    0 Z% Y6 m% k5 n+ Q% o内层for循环如果没有内部操作的话,编译时应该被优化掉了,和你完全注册掉整个循环是一回事。可能你的编译设置没有打开优化?" @0 A" E' q$ Z; a3 x+ }
    VS社区版没有问题,我工作用的就是社区版,设置正常的话不会比商业版差。以前游说头头用Intel Compiler,他说不想花钱,而且差不了多少,就一直用到现在。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2025-11-9 05:53 , Processed in 0.042034 second(s), 19 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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