设为首页收藏本站

爱吱声

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

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2022-9-24 22:54:26 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
    C++ 比 Octave 慢好多,怎么破?
    % q! k; e/ X, I* T" m, K9 j3 s. X! I$ C1 n9 i; w2 |
    自相关两层循环,内层循环涉及浮点数计算,试验了一下把内层循环内部全都 comment out 只留个壳子,  但空的内层循环本身就把速度拉下来了,看来问题并不在浮点计算。! v* h2 g0 m* t) _

    # ?8 f7 N" {3 N4 [1 _# l& H速度优化问题真的很有意思啊。! ?7 ]. E: p& [9 n/ A
    / \, ]! b$ R6 U' S7 K8 w
    欢迎大家继续讨论

    评分

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

    查看全部评分

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

    [LV.Master]无

    沙发
    发表于 2022-9-24 23:04:16 | 只看该作者
    拉下来?拉多少?1 k. ]  L! X9 l, ^* u1 R
    把代码贴上来看看?
    9 `! g: J) N& C4 M4 S$ m' G2 L: B) g: ^$ L7 z
    难道分支预测不准破坏流水线执行?不该啊。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    板凳
    发表于 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 编辑
    - v3 y+ S0 R6 ?/ B2 O
    数值分析 发表于 2022-9-24 23:049 {) c* Z3 u# k7 U# C: \
    拉下来?拉多少?
    & d3 z2 z. z9 G2 |* E/ s把代码贴上来看看?

    & y5 N# Z* b+ ]  W
    ! ?. \5 c  y( Fvoid xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)6 @, Q" u/ ?9 A( |/ M
    {
    5 A) m+ r: u7 z  `% C3 E        comp temp, xtimesy;$ i7 _; b+ E' X* C/ t
            xtimesy.re = 0;. s" X: P$ Y6 p# Q. ?. q8 @. ]
            xtimesy.im = 0;! L5 K8 l% \5 Z8 J7 D. b
            int j0 = lenB - 1;
    - l' _- J' D1 U( E! m, A        int    i, j, i1, reali;
    : i* F1 y5 I0 h# A6 @2 V        if (lenA % 2 == 1)) n' o: I+ _9 v/ T8 t
                    reali = lenA + 1;
    6 r: H$ o! A0 y4 z/ {        else8 K5 T7 _( H) M9 @  s) x  z
                    reali = lenA;( z: \0 P3 N; z# {- u
            reali /= 2;, R) i0 K) G% P

    3 ?! |9 f( J5 M        int nconv = reali + lenB;
    # H' R  e) u! o4 H3 E; U        //#pragma omp parallel for
    8 w5 z* {5 W1 o8 h        for (i = reali; i < nconv; i++)& J- v  c) _  @; o
            {
    8 i9 O" O* Y5 L                temp.re = 0;" G3 c. Q& ?- g
                    temp.im = 0;
    , B0 D6 \5 }' L4 |                i1 = i;% r  a# k' W3 v
                    for (j = j0; j >= 0; j--)' L" r$ g" i% }0 Z8 \
                    {
    & [& Q; [4 Z; o- B                        /* floating date operation */
    5 Y7 r7 e% z9 ~" U* Q                }

    - T+ G7 ]- c# L" z8 W- a( |0 W        }6 X/ ]3 n3 c6 L: A7 ^
    }
    + g, e! r6 ~5 a& s0 M9 v! e$ L9 v$ K/ s: @6 D- c; ?
    xcorr函数代码如上,comp是复数struct, 做过长度为11、19两个矢量的测试,和octave结果完全一样
    # G2 }3 Q1 Z' P6 J% q- k+ Q- Y
    ( f& c4 s. K4 {4 V  T红色部分是内循环,现在其内部操作都comment out 了, j0大概是 6000。
    . T. c7 L) Z/ F, U/ ]现在call xcorr 100次,耗时78s.% y) Q2 U. ]& C
    9 A; h7 c$ O+ G% V0 P  f" q
    如果把红色部分内循环本身完全comment out, call xcorr 1000次,耗时 <1s. 4 }( r* K- {5 ^; F

    . ]) U9 w* Y8 a" b) A/ H- c  X* g
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    6#
     楼主| 发表于 2022-9-25 00:17:17 | 只看该作者
    风雨无阻 发表于 2022-9-24 23:33
      O" h* [4 F  o* P! \2 oMaybe Debug mode?
    9 f/ ^' x% B4 P
    3 S0 f7 }8 j( a* h2 T
    不应该,看我上面的回复。, Y3 c$ X9 [( ^5 e

    ; E3 `2 Y7 h8 j6 E4 |" |+ ?我更怀疑是 VS 社区版的问题
    回复 支持 反对

    使用道具 举报

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

    [LV.Master]无

    7#
    发表于 2022-9-25 00:20:10 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 00:24 编辑
    # i8 V6 i4 ?* m
    雷达 发表于 2022-9-24 23:54) o2 Z) N/ d1 q4 f. G4 A
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    ) n2 z+ v' ^2 ~2 k) Z{' p% `1 [8 Q0 S3 W3 C0 X$ l  v
            comp temp, xtimesy;

    8 |: {' B1 M8 v1 c6 ?* x$ P
    / i4 v$ E# }" \1 G. a这个不是这么比的吧。。。
    $ g  P$ h6 {+ R  P
    ; h# {; k2 C( E' t+ `- }6 P您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。- k2 A  `# m7 t4 m
    6 t- R: l2 W' Q) M8 q
    而加上内循环,光jmp和dec指令就至少多执行了6000个,慢个几十倍不是正常的么?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    8#
     楼主| 发表于 2022-9-25 00:46:56 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 01:09 编辑
    ! Q9 {$ D, h' J  U% z0 @
    数值分析 发表于 2022-9-25 00:20) T* }$ e* n' c! ?
    这个不是这么比的吧。。。9 R3 F* c- R- z, o: k! Z3 r; `
    5 f: k* }; G: M. R
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    1 _0 c- C$ n% \- Q1 @# @( k3 ]0 y

    # z8 q: x/ Q% B( N8 Y有道理。
    & C7 l; ?3 l: X1 ~: T& {  D所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,记得 numeric 库里有算向量内积的,我回头试试。
    $ R- G' y2 A6 R$ O9 |) ~: z7 b; W; ~5 G7 W
    我先尝试尽量用标准库,一个小程序,不想搞得太复杂。多谢了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    9#
    发表于 2022-9-25 01:27:53 | 只看该作者
    雷达 发表于 2022-9-25 00:46% t. W* M7 d7 a. {$ i9 L
    有道理。9 l+ a- h0 v+ l3 L% m
    所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,这大 ...
    ' i/ \' e6 }4 N# e) \
    你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子,把循环本身翻译成机器指令loop或dec/jnz,两者速度上会差很多5 e% w" m9 ^$ }4 u, ~+ W* a* B7 U
    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
    9 T9 W) g$ }! ]0 e; ]' M4 Z这个不是这么比的吧。。。
    8 o% X8 N  J6 e/ ?& ]4 N2 y
    7 n" {, t/ h+ H7 H您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    而加上内循环,光jmp和dec指令就至少多执行了6000个
    - o: u  O5 G/ E' F8 P. h- K
    / b# ?; S3 a& M+ S+ X( R
    现在的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 编辑
    - N2 s2 s" n' s$ i. l+ J
    沉宝 发表于 2022-9-25 01:48" f# R5 L% t" \# A( \
    现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果 ...
      M3 U4 O3 r: m, {% Y8 n: D+ O9 Q

    0 D( M& @/ @$ P  ?9 h# B7 w是的,兄台说的对。
    6 N4 E" z# e8 P* g* l# {8 D6 B% Q( x
    其实我想说的是 真正数值计算部分和代码中其他不直接计算的overhead的比值这个事儿。% [1 H6 G$ @- z4 q9 i) }" j

    1 A0 m; p! |$ T4 x2 C$ |  p/ u雷达兄构造测试用例的时候,屏蔽掉了所有计算的部分,使得剩下的都是overhead,这样run time比较的结果就显得好像不合理了。如果把计算加回去,计算部分的run time会dominate,结果就不那么离谱了。因为不好说,所以用指令数对比的方式试图直观地说明这一点。
    ' m+ F( _  ]. S& _9 r9 _0 J+ U! r* k9 Z: `3 }
    比如说,如果有计算,那么跑六千个循环相对于计算应该用不了多少时间。但是如果一边是什么都不做,另一边是六千个循环,那六千个循环比什么都不做慢几十倍了,就不是那么不合理了。
    . Y! J1 I* x5 a8 V  C- V8 X: j* _- g' f: o9 F, m* X6 i
    当然也有可能像兄台说的,是优化参数的问题,但我觉得更多地是测试用例设计的不合理。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    12#
     楼主| 发表于 2022-9-25 04:47:43 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 04:49 编辑
    5 c# m: v2 E3 @& q9 i% S
    沉宝 发表于 2022-9-25 01:27
    . n0 _6 G1 x* Y* L' i6 @) P你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子 ...
    , b0 I1 h$ D1 W5 Z  j0 D7 b5 D
    / Q( q8 ^+ s. X$ T1 q) Q
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差一倍,我上面这个差的太多了。
    : I, g9 Y# c1 N* U' x! A, E- M; ~4 u7 f+ @% W3 s" O
    我已经完全懵了。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    13#
    发表于 2022-9-25 05:51:23 | 只看该作者
    雷达 发表于 2022-9-25 04:47: n. {# `0 i" [
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...
    . C3 y, M) `  }! m) C3 V( ?0 [
    时间差一倍的结果可以接受。5 E/ u; W1 r/ D

    ) l( ]8 ~) e, v: h3 W1 p* ~' b  G+ \你还是用profile工具看看吧。现在大家都主观瞎猜。
    回复 支持 反对

    使用道具 举报

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

    [LV.Master]无

    14#
    发表于 2022-9-25 14:58:59 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 15:38 编辑
    - `* f' s. Q5 |, j5 u. y- f
    雷达 发表于 2022-9-25 04:47
    : a$ U9 _8 n7 Y5 m8 p4 ~又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...
    5 U6 g" H' _: n- v! I: s, v, g
    % n/ n( j- m: `8 f! g  x

    ) Y; ^9 i9 V* A+ i# l. ?3 s7 q: b6 {1 ~4 v
    能不能把这个也贴上来,看看和上一个有什么不同?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    15#
     楼主| 发表于 2022-9-26 01:30:03 | 只看该作者
    本帖最后由 雷达 于 2022-9-27 01:17 编辑
    : j- _* \: ?; E
    数值分析 发表于 2022-9-25 14:58! t; P2 E- D* e$ {/ Y
    能不能把这个也贴上来,看看和上一个有什么不同?

    " b7 F5 q: _) ?7 D! p理了理思路,重新做了一个测试。
    7 t0 O# }7 `; U5 u; w) n6 ^做了两个 vector 和 两个 float *, 都长 100000
    ( h' r. k0 n# ^  B" ?! A外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
    , i4 ^% B+ ~1 C7 m4 J/ W3 j1 S8 ~) H, \0 t+ Z
    内循环试了4种方法,8 ~/ s8 ~. n( Y% i- X, k: m
    1. 直接调用 vector inner_product 247s
    6 U& s8 ?& y5 l5 Y1 Z2. vector 循环点乘累加 237s
    . R, E6 ~1 T1 O7 Y9 m3 s3. float * 循环点乘累加 204s
    + u# y$ P4 S% z! ]9 L' J4 K4. 空循环 100000 次 202s( g. T+ n: `% W7 r5 v' Q

    ' J" G, O6 A# l2 Z) |  s不做内循环 200s
    * p4 f6 n5 V# i4 `; n* {/ l. a' U1 w4 m' l1 {" u
    你昨天说的对,内循环本身占比是很小的,大头在其他处理。! p7 i6 M# c6 T: q( D
    另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。( n$ d7 X4 I$ ~' ]. M0 V8 t

    ( H9 e; s3 p  r; B/ e至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
    6 r! \% o0 c1 Q$ l. W
    / \" s% a/ B# m/ H(为什么下面我贴的  b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成  jj 好了,原来 方括号里的 i 是斜体标志  LOL)5 }: _7 T# b' h7 c9 u+ F) _5 S

    0 _! R0 S: Z* l) @/ g6 S' O
            std::vector < float > vec1(N);
    2 r$ V4 s( w# K, ?1 T        std::vector < float > vec2(N);
    6 w! q1 f/ j! N! I( j! J        float* b1 = new float[N];0 M  K' R) ]4 b  }& t% d- p
            float* b2 = new float[N];! l8 ~. ~1 R& }6 j! U( G

      C/ r# F+ X+ W# Q, B        for (int j = 0; j < 6000; j++)
    : d# o% V; c- L! G& {        {4 ]7 z* b" f8 M; g
                    std::generate(vec1.begin(), vec1.end(), []() {
    4 P, Y9 C; |! J! B5 H                        return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;8 @) @: H9 ?* d# r
                            });
    % p6 Q# c" j! M" c" c4 ~
    ' Z0 s+ @- V% n                std::generate(vec2.begin(), vec2.end(), []() {, `$ O& x$ J6 _9 n! [& `# O
                            return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;: T8 `! P* s; C# R' k- p
                            });
    6 L+ L2 ?1 t. M- Y. k" S) ]$ x2 ]; q( U0 k5 i# x
                    for (size_t jj = 0; jj < vec1.size(); jj++)
    / C9 ~' [1 V. |+ N; G* ?. x" g: v                {% D  R' ?5 o* q" J. X( F
                            b1[jj] = vec1[jj];2 U" F# [) f9 I6 L  Y, O. |
                    }$ C3 s* I! h; v$ V# [
    % ?& o1 W$ C; ~  q4 c! |
                    for (size_t jj = 0; jj < vec2.size(); jj++)0 W7 c& x# }- e& y8 d$ l
                    {
    % ]4 K7 ~0 k& s                        b2[jj] = vec2[jj];
    1 z9 K1 g9 s' I! g# q5 m                }
      c2 d' _" v- n$ n
    3 Z  q; ^" ~  c7 E; ~% h0 u                //Method - 1  N=100000 247s  
      W# N% j. N9 a                //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
    / `, ?8 X5 D  z7 {                                
    1 L& Y; d% F1 `$ R' D                //Method - 2  N=100000  237s9 C, h% I7 x/ ~* q
                    /*; I( Y# \* g  a
                    for (int jj = 0; jj < N ; jj++)( g* a' U) Q# O( g
                    {
    ! ]8 l6 G8 C2 {' N                        fresult += vec1[jj] * vec2[jj];
    / O& r2 I& E7 e8 |# T                }- H% u, g9 J6 B3 O9 D% L1 [* M3 Y
                    */( h* b! x2 B( @4 s; i
                                    
    6 f! l; C  O) D+ i# P$ ^2 a                //Method - 3  N=100000 204s5 \6 w# T# M6 r+ W
                    /*
    9 V; \. j# f3 c5 \8 X% l4 W3 D                for (int jj = 0; jj < N; jj++)) r/ P& ^+ O+ S0 h7 c
                    {
    * x; u& ^( i8 ?& Q: F+ ]6 z7 h4 s                        fresult += b1[jj] * b2[jj];
    3 V( W) H6 w0 L/ G. g, J) h6 y8 ^$ p                }- F1 I2 ^- d" R8 Z' b
                    */
    8 a7 I/ L6 S7 j
    3 a! b7 S. |/ V7 w" z* a& @2 Z/ S  u                //Method - 4   202s
      _  O0 w( w7 K0 H  {. |6 k/ |                /*2 B/ u, J4 D' x8 H$ |. [& g
                    for (int jj = 0; jj < N; jj++)) H0 r4 u$ w2 Z) {$ z
                    {
    / [! k& V' \, ^1 y/ p  U                        
    " W% |; e2 t# V                }
    ) X% H5 f" V4 S                */& e' l* |9 }* P' B, T
                    //comment out all methods, N=100000  202s               
    : E% ]. {/ t1 m6 E# E' P        }
    : a, O7 \, \0 L) Y2 P+ y! z5 z" O/ @2 P7 Z
            delete []b1;0 O2 X5 `* a$ R
            delete []b2;
    8 \5 x( f  l- j
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    16#
    发表于 2022-9-27 00:15:38 | 只看该作者
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?% [# S* L% W$ n, l

    " V# `$ }9 a% J6 t% Z6 q  C4 d你第二个试验里面的j在循环里面又重新定义了啊,你确定真的跑了6000次?
    2 b- D1 g6 J9 C6 ~' ]2 r
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    17#
     楼主| 发表于 2022-9-27 01:16:03 | 只看该作者
    机器猫 发表于 2022-9-27 00:15
    2 z* n3 J$ H) a# Y  C" G瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?
    $ E9 n9 b4 V$ l3 I! T3 [5 F. V& f8 w8 S) K( Z
    你第二个试验里面的j在循环里面又重新定义 ...
    ) F" B' b& x* s$ H7 a1 ^1 C
    内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL
    + q5 h. d" g. ~5 ^" E. v$ O8 K/ ~7 I& p3 g1 m8 b" M) t% k
    不和它较劲了,瞎耽误工夫,我已经转到 ubuntu, 也准备顺便试试 avx2 向量化。
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    18#
    发表于 2022-9-27 02:06:58 | 只看该作者
    雷达 发表于 2022-9-27 01:165 J; v& N1 w0 c& |
    内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL
    * k/ `& u$ c7 m. u  K' H5 G9 _/ J
    不和它 ...

      L% k# B9 x# g$ x* z% x+ P6 z2 o8 d$ Q  }4 g0 B% s
    不过可以试试我说的register变量。前一个试验j是混在一堆其它变量里一起定义的,很有可能是在stack上,这样内存读写会更多,要是再碰上每次都需要加载cache就更慢了。4 s$ B3 C0 }0 ]. N: R
    后面一个是在循环那里定义的,说不定编译器就把它优化成register变量了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

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

    使用道具 举报

    该用户从未签到

    20#
    发表于 2022-9-27 20:29:50 | 只看该作者
    雷达 发表于 2022-9-24 23:543 l1 g9 l" [% Z5 `' p
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    " i& {) q0 C$ ^# `{
    % i: _" j* \7 l* y, s* J4 l: {        comp temp, xtimesy;
    6 q: N  `: n' q4 M: ?" Z; f8 \
    这个code里面如果Openmp没有被注释掉的话,那么temp那个变量应该是定义在循环里面,否则线程之间会存在争夺写入那个temp的风险。
    ! A* N1 p  d: S内层for循环如果没有内部操作的话,编译时应该被优化掉了,和你完全注册掉整个循环是一回事。可能你的编译设置没有打开优化?
    % o5 w) Q& _1 T- mVS社区版没有问题,我工作用的就是社区版,设置正常的话不会比商业版差。以前游说头头用Intel Compiler,他说不想花钱,而且差不了多少,就一直用到现在。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2025-12-11 18:45 , Processed in 0.040419 second(s), 19 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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