设为首页收藏本站

爱吱声

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

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2022-9-24 22:54:26 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
    C++ 比 Octave 慢好多,怎么破?7 \3 Z( o6 x8 K# t% ]
    0 O4 a9 g5 Y; o) x* x
    自相关两层循环,内层循环涉及浮点数计算,试验了一下把内层循环内部全都 comment out 只留个壳子,  但空的内层循环本身就把速度拉下来了,看来问题并不在浮点计算。7 {+ q9 j8 h$ w" W2 B  X

      |3 D7 T. Q" s3 C1 E9 z  E/ L速度优化问题真的很有意思啊。
    * m0 @7 B; o+ p( [; U
    - v8 U( ^1 T, D% o& x) T欢迎大家继续讨论

    评分

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

    查看全部评分

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

    [LV.Master]无

    沙发
    发表于 2022-9-24 23:04:16 | 只看该作者
    拉下来?拉多少?' p: F1 F* ~' [1 v2 S4 q& S
    把代码贴上来看看?5 Y3 [) k& H8 Q4 Y% J0 a

    % w& u/ _/ c( F; z( T. s2 _难道分支预测不准破坏流水线执行?不该啊。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    板凳
    发表于 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 编辑 + T. [6 N! D/ i+ F* d  x( g
    数值分析 发表于 2022-9-24 23:04
    ( q8 ~- i8 g& A; l0 c' ^7 ]拉下来?拉多少?
    , f* i% |" `# O* K- B- C把代码贴上来看看?
    & x( A0 g& t' M0 c& j
    # _! m) {- ?3 @( D# f
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)1 A% |# r6 X! v' R
    {( v4 t: B  h: R) G) t! X/ w
            comp temp, xtimesy;
    ) R$ @( n  K: w* M        xtimesy.re = 0;
    4 M( ^! _  i. f; r5 [        xtimesy.im = 0;+ B/ b; d; N0 Z9 T, y9 c
            int j0 = lenB - 1;
    6 `5 [3 ^0 t2 b3 ~! I( |        int    i, j, i1, reali;) {3 q: l4 Q4 P3 q+ ]
            if (lenA % 2 == 1)
    $ F8 N- j0 N' x                reali = lenA + 1;
    8 u1 v! t) O6 Q4 q" U' J        else5 a; n, x! c8 R
                    reali = lenA;1 l  Q! W7 |. x& R- y. J0 c) ^% ~
            reali /= 2;
    ' ?1 F& b6 {2 K. X3 v
    ' j" F. i% t" L' w. C) v% L; I        int nconv = reali + lenB;
    5 w. D& Q5 y! e  J' e* x  z        //#pragma omp parallel for3 g* v" X4 T( q& W
            for (i = reali; i < nconv; i++)
    : T  l0 \, |2 M5 y2 A' |        {
    * x7 o6 l7 L/ ]) O- q# a& x                temp.re = 0;
    7 h& A, a; }; @4 k) ]                temp.im = 0;
    # |. c4 c$ s1 }. F7 G' G% B8 D                i1 = i;1 S8 b3 `9 ?3 S: o# L
                    for (j = j0; j >= 0; j--)
    * w9 t, t- ?" p7 Q6 l- Q+ a$ z                {
    ( s" [/ M( s' N3 w, n' M                        /* floating date operation */
    7 q; G; b5 o+ [* L                }
    1 Z$ U  Y; F; m) Z. p7 C0 {
            }, ^9 i# D$ Y8 v2 t& r- C" g! j
    }6 G# S2 |3 H' T1 \- r/ J, y0 s

    6 _" e3 d# ?7 {0 h2 Y" G, W, {6 hxcorr函数代码如上,comp是复数struct, 做过长度为11、19两个矢量的测试,和octave结果完全一样
    3 V7 J$ a" K2 T$ c( }4 V; \1 w4 v# O- l+ i& y6 S
    红色部分是内循环,现在其内部操作都comment out 了, j0大概是 6000。) P1 R! S( P) t
    现在call xcorr 100次,耗时78s., K, U# g: R) m1 M, O
    0 R0 {! v% m- n" n
    如果把红色部分内循环本身完全comment out, call xcorr 1000次,耗时 <1s. 2 H/ H! @6 L3 R; n4 M; b
    ' Z: p5 }! s. T9 p  O( C9 ?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    6#
     楼主| 发表于 2022-9-25 00:17:17 | 只看该作者
    风雨无阻 发表于 2022-9-24 23:33
    , M% h. M4 n" q2 m" X( HMaybe Debug mode?
    % }' A. N  ]- \* l
    8 ^; ?. J" z; o: A
    不应该,看我上面的回复。
    0 {! S7 F: O# [# }1 }8 E) a4 g+ a. i+ X, t) Z. h! Q( _
    我更怀疑是 VS 社区版的问题
    回复 支持 反对

    使用道具 举报

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

    [LV.Master]无

    7#
    发表于 2022-9-25 00:20:10 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 00:24 编辑   d  P: t4 [3 ]  v; ?' Q+ O
    雷达 发表于 2022-9-24 23:54
    $ }9 ~* N0 p  L) }- }- K3 c. o+ Pvoid xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)# e& p" ?$ B8 F8 y3 [
    {
    ! H/ V- j' g1 c. Q4 m        comp temp, xtimesy;

    - _( Q% `  C4 _5 ~7 @7 A* Y6 l/ `4 L3 A
    这个不是这么比的吧。。。7 Y* T& z( M" D; L" j

      H9 F+ t: E7 W& N+ O1 @$ U3 Z' ]您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。2 _6 @- q5 y  b

    * K* |, h& s% `4 g而加上内循环,光jmp和dec指令就至少多执行了6000个,慢个几十倍不是正常的么?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    8#
     楼主| 发表于 2022-9-25 00:46:56 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 01:09 编辑
    . R8 p- a- f( z
    数值分析 发表于 2022-9-25 00:20/ P2 o& c* F, U
    这个不是这么比的吧。。。
    , t& {7 O2 @* h- ?/ m" Y, d
    7 I+ o. P" C% s6 M9 a% ~2 y! \) a7 Y您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    : t  ]: @6 T- [/ U. g

    / C& R. x! P5 A6 h5 @( H有道理。! \1 M5 ~8 X  k; M
    所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,记得 numeric 库里有算向量内积的,我回头试试。& b5 ?+ |# K0 k7 I

    % A7 S* _7 l) o2 K9 c( y我先尝试尽量用标准库,一个小程序,不想搞得太复杂。多谢了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    9#
    发表于 2022-9-25 01:27:53 | 只看该作者
    雷达 发表于 2022-9-25 00:460 g7 t9 A$ q' I5 h+ `
    有道理。7 j% M+ C4 {1 l
    所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,这大 ...
    4 N; _- F$ r: C& l' z
    你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子,把循环本身翻译成机器指令loop或dec/jnz,两者速度上会差很多
    $ e7 |" I3 M2 {' F4 w8 b2 |! S& AWhy is the loop instruction slow? Couldn't Intel have implemented it efficiently?
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    10#
    发表于 2022-9-25 01:48:51 | 只看该作者
    数值分析 发表于 2022-9-25 00:20
    4 G8 q" G8 R1 u  ]; D) b+ o, g这个不是这么比的吧。。。
    9 A2 F' g! c4 r" N
    - q+ G6 s/ l; I9 c' h0 J您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    而加上内循环,光jmp和dec指令就至少多执行了6000个

    / {/ ]/ l. q! K" f( m2 x% t7 d6 h) S8 ^4 e1 w
    现在的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 编辑 " S/ v" X& ]/ G% W8 ~' Y( |( ?
    沉宝 发表于 2022-9-25 01:48$ `+ D3 Z$ y* V2 U
    现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果 ...

    * b% X5 H; r1 E. i+ P0 `' R/ y6 e2 h  F% D
    是的,兄台说的对。4 K/ y- g; T' ?2 J$ {
    : i, C& s$ A1 U. Y& ~( p
    其实我想说的是 真正数值计算部分和代码中其他不直接计算的overhead的比值这个事儿。
      n( {8 w8 `- O, A
    & ]4 C; t* A; B5 Z& e/ F雷达兄构造测试用例的时候,屏蔽掉了所有计算的部分,使得剩下的都是overhead,这样run time比较的结果就显得好像不合理了。如果把计算加回去,计算部分的run time会dominate,结果就不那么离谱了。因为不好说,所以用指令数对比的方式试图直观地说明这一点。7 x0 i+ S8 Z; x2 ~# T! m' [1 S) ?

    4 R8 s6 D2 {: i比如说,如果有计算,那么跑六千个循环相对于计算应该用不了多少时间。但是如果一边是什么都不做,另一边是六千个循环,那六千个循环比什么都不做慢几十倍了,就不是那么不合理了。+ g- |5 P8 O# h$ B! D% D" V$ m

    " l/ j* v* s3 b& l; H当然也有可能像兄台说的,是优化参数的问题,但我觉得更多地是测试用例设计的不合理。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    12#
     楼主| 发表于 2022-9-25 04:47:43 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 04:49 编辑
    - ~- U: l) t; Y3 H* ~8 r; R0 q
    沉宝 发表于 2022-9-25 01:27! T( K' [7 T9 H1 g
    你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子 ...
    4 m& j9 M7 r' z/ F8 {

    $ ]  d# \' Z% s0 ~2 r又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差一倍,我上面这个差的太多了。
    # j3 ^' C+ A2 m! E' H0 w+ G; q
    # y! y4 l3 G. D我已经完全懵了。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    13#
    发表于 2022-9-25 05:51:23 | 只看该作者
    雷达 发表于 2022-9-25 04:47
    + M- I& S) e: j1 e5 \- q又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...
    3 \6 p" p, B/ R4 Y1 t
    时间差一倍的结果可以接受。
    4 Y3 B# j2 Y" P: a: x% |
    & \& B7 f/ R4 \& H你还是用profile工具看看吧。现在大家都主观瞎猜。
    回复 支持 反对

    使用道具 举报

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

    [LV.Master]无

    14#
    发表于 2022-9-25 14:58:59 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 15:38 编辑 ' T/ _" I5 `1 \  C" M8 q/ j
    雷达 发表于 2022-9-25 04:47/ g& w0 g. K: c
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...

    2 \( `, K" d3 F, H
    # q7 g: o9 ~9 J' y0 s4 ^8 e9 t
    # O# F3 H( y6 Z  S: g) z8 M
    4 {2 X) N; `% l: o& h能不能把这个也贴上来,看看和上一个有什么不同?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    15#
     楼主| 发表于 2022-9-26 01:30:03 | 只看该作者
    本帖最后由 雷达 于 2022-9-27 01:17 编辑
    ; f# M6 N6 W8 ?# ?& y: N
    数值分析 发表于 2022-9-25 14:58' Y. Z1 q  G  M& t1 o5 l  X7 s  }6 K
    能不能把这个也贴上来,看看和上一个有什么不同?
    6 P8 L) ^( ~8 E2 c, f' Z
    理了理思路,重新做了一个测试。
    " j6 t0 ?% x0 k$ Q4 G8 E做了两个 vector 和 两个 float *, 都长 100000
    & U* P7 E% s1 k/ j4 @# n外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
    - c& U- A1 ^, h3 i# A- T6 @2 P5 e! o" N7 H
    内循环试了4种方法,! o3 h( }- H* N4 `# c/ G6 m2 v' \, _
    1. 直接调用 vector inner_product 247s ! d  z+ B) F. m1 z- R
    2. vector 循环点乘累加 237s
    - o$ e/ f) |! ?" O3. float * 循环点乘累加 204s- h+ A0 L2 A# h
    4. 空循环 100000 次 202s3 o# c+ ~2 z; h! `9 D2 [

    ( Q; D' m0 i7 d, p1 I不做内循环 200s0 u( c2 C; |8 _/ v+ Q

    - W" c5 @- m* {你昨天说的对,内循环本身占比是很小的,大头在其他处理。2 O1 m+ v- b5 a% Z; J% D: u1 z3 v
    另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
    9 y0 T6 \; p) x6 `5 ~/ ]( t9 m! s+ W
    至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)4 C9 j- x  Y( q, |
    1 T6 p1 v, f( p" y* e# y
    (为什么下面我贴的  b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成  jj 好了,原来 方括号里的 i 是斜体标志  LOL)! z- O  g# |2 Y1 `& V% V
    " P' ]2 \$ M3 J, b; Y
            std::vector < float > vec1(N);! }; ?4 w# y2 E; Q0 }
            std::vector < float > vec2(N);
    ) D+ A' e9 Q; Z+ Q) H% `" \5 [# o        float* b1 = new float[N];
    * W, i+ D" d' G/ u. V  y. ~        float* b2 = new float[N];7 g& |6 H/ u! u
    * Y4 s- \( b. b, O
            for (int j = 0; j < 6000; j++)! G4 E6 J1 k, v6 C- `) @
            {! ~+ a1 R: c6 r9 Z
                    std::generate(vec1.begin(), vec1.end(), []() {7 j8 S# f$ u- c5 Q) [) @( @& G
                            return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;1 K# N2 J. U8 O( @% J' T) G* f4 {
                            });, s3 B% W9 G1 R7 K! h# |

    $ R$ O5 l4 u) W! @( P7 k) L7 u                std::generate(vec2.begin(), vec2.end(), []() {+ D6 ^+ m% ?2 J6 }. ?
                            return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;3 d" V+ Y: R2 K3 V6 e" B& @1 ^
                            });) g0 ?# {  G' {+ H

    0 L( G- r2 K) k3 U6 ~  H                for (size_t jj = 0; jj < vec1.size(); jj++)
    ' Z5 f8 g, t# I( B/ H3 N                {
    1 c+ E% O6 ]4 o) h8 ^                        b1[jj] = vec1[jj];/ b- C1 ~' w& ?2 i% n
                    }7 B2 i0 [- M/ J. D, ?8 \
    % ?8 R; f0 h! q, W$ S' n
                    for (size_t jj = 0; jj < vec2.size(); jj++)
    4 Z6 P" q6 ?7 W) x- ]  B" N2 ^                {
    7 }$ r8 i/ m: N$ f2 z6 C4 r                        b2[jj] = vec2[jj];
    1 p! N, u1 o8 H% _                }
    / u& w7 s* J; G4 U' s& t( r6 n. u' y" n: Y$ Z& [
                    //Method - 1  N=100000 247s  0 p4 n) A! v( F+ I! }
                    //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
    5 H7 U" ^) |# }8 C2 y                                
    & A/ c  g" X  N4 Q                //Method - 2  N=100000  237s
    " X$ R6 o* A; Z) \5 z                /*
    " s$ n* F5 ^" X% U$ W                for (int jj = 0; jj < N ; jj++)# p2 z9 L  u$ u) o# }, X- }
                    {
    6 o! {9 l- c' @5 H# o7 |2 G                        fresult += vec1[jj] * vec2[jj];
    5 F) x; `2 W1 M1 `1 a                }* L1 a  N; D4 Z
                    */1 v5 N' k3 E7 s
                                    % O7 T0 q# N! h# [. E4 }% `
                    //Method - 3  N=100000 204s
    & X. n0 p/ ~2 I7 t6 v                /*
    % U$ R4 O! e, x4 ^: U" P+ p                for (int jj = 0; jj < N; jj++)5 S2 W4 ?9 q8 x
                    {
    1 s3 X7 c5 X" Y  ], |" u  _                        fresult += b1[jj] * b2[jj];+ Y& l- o) u( a9 o2 t1 K
                    }% |* ]  u; w2 ~- @7 {
                    */
    % ?' y# C8 @$ m8 R$ a! }1 J3 x
    6 I9 u5 ?8 F: m" G6 l- b                //Method - 4   202s% \* V+ e! E2 B( ]1 {5 R7 C" N( v
                    /*8 j1 L: w- C( @) s
                    for (int jj = 0; jj < N; jj++)
    3 O& Y( r, f! i) s0 L3 Z                {7 U6 Q; ]8 k) F& w% Y
                            0 T  \" @; S  @: @1 [( K4 P' v
                    }' G: }+ ~) N7 m- u8 q( H
                    */
    . g- F$ a; h& }                //comment out all methods, N=100000  202s                % b  }  K! H7 n' P( m
            }
    2 |* ?/ y: Q' b% Y: n) j4 K# O0 }- I
            delete []b1;5 v& h& s5 V0 I  c! c
            delete []b2;
    0 y: P. K: |2 s$ U3 e$ n
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    16#
    发表于 2022-9-27 00:15:38 | 只看该作者
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?, I0 ^1 ^# ?* f$ H& O  K9 \& F5 R

      Q' n' e" c8 p& S2 S你第二个试验里面的j在循环里面又重新定义了啊,你确定真的跑了6000次?
    6 O) h' r8 {0 m$ {
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    17#
     楼主| 发表于 2022-9-27 01:16:03 | 只看该作者
    机器猫 发表于 2022-9-27 00:15* w4 c6 u+ S) n2 J1 w* L1 q
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?
    ; I0 w' I3 ]5 \1 M/ ?
    3 G! [9 A  r. V" h, M  _  E1 A. @. J你第二个试验里面的j在循环里面又重新定义 ...
    % @# D. _/ p  m6 {8 V' k( @/ r
    内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL
    9 Q/ N  M+ w3 |2 _" G
    9 S2 ~+ s& k7 k不和它较劲了,瞎耽误工夫,我已经转到 ubuntu, 也准备顺便试试 avx2 向量化。
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    18#
    发表于 2022-9-27 02:06:58 | 只看该作者
    雷达 发表于 2022-9-27 01:16
      p% e4 }' G/ n3 G内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL
    1 d8 u/ Z# r( l. m2 ~6 `, J& q- F  w0 G; \- Q
    不和它 ...

      p0 }8 L7 q6 ^) m6 f4 w- `; y# Q( p( N+ ]
    不过可以试试我说的register变量。前一个试验j是混在一堆其它变量里一起定义的,很有可能是在stack上,这样内存读写会更多,要是再碰上每次都需要加载cache就更慢了。
    1 t1 ?- F: ?1 h. F8 X  j后面一个是在循环那里定义的,说不定编译器就把它优化成register变量了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

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

    使用道具 举报

    该用户从未签到

    20#
    发表于 2022-9-27 20:29:50 | 只看该作者
    雷达 发表于 2022-9-24 23:54
    ' R# ]! l0 j4 L" [void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    * z, U7 R9 z/ b) w0 _{
    ' x- G/ i9 Z9 F# L5 S8 t/ V        comp temp, xtimesy;
    1 K5 O- i, X# L4 n5 d$ ~
    这个code里面如果Openmp没有被注释掉的话,那么temp那个变量应该是定义在循环里面,否则线程之间会存在争夺写入那个temp的风险。
    5 a! h' o' {5 \$ c内层for循环如果没有内部操作的话,编译时应该被优化掉了,和你完全注册掉整个循环是一回事。可能你的编译设置没有打开优化?( G4 h, ~5 P+ v4 M* ~" z4 `# t
    VS社区版没有问题,我工作用的就是社区版,设置正常的话不会比商业版差。以前游说头头用Intel Compiler,他说不想花钱,而且差不了多少,就一直用到现在。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2026-6-22 06:10 , Processed in 0.066473 second(s), 18 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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