设为首页收藏本站

爱吱声

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

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

[复制链接]
  • TA的每日心情
    奋斗
    3 天前
  • 签到天数: 1184 天

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2022-9-24 22:54:26 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
    C++ 比 Octave 慢好多,怎么破?
    & S8 f4 B3 q: Q( J
    / n0 z0 u" a9 w( e& T自相关两层循环,内层循环涉及浮点数计算,试验了一下把内层循环内部全都 comment out 只留个壳子,  但空的内层循环本身就把速度拉下来了,看来问题并不在浮点计算。
    4 B5 P* T" f3 q# ^# z3 x, m3 g5 F
    速度优化问题真的很有意思啊。
    3 s6 w/ ]+ T. l9 s( S/ e! L0 v. [( t# g
    欢迎大家继续讨论

    评分

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

    查看全部评分

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

    [LV.Master]无

    沙发
    发表于 2022-9-24 23:04:16 | 只看该作者
    拉下来?拉多少?
    * J/ }2 O9 B* ^) T6 `4 y把代码贴上来看看?  J3 O$ I3 Y5 t) e+ k& |
    6 I& i1 c" S4 E) p0 n3 E/ i
    难道分支预测不准破坏流水线执行?不该啊。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    板凳
    发表于 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的每日心情
    奋斗
    3 天前
  • 签到天数: 1184 天

    [LV.10]大乘

    5#
     楼主| 发表于 2022-9-24 23:54:10 | 只看该作者
    本帖最后由 雷达 于 2022-9-24 23:57 编辑 ' O( I& c( j' w' Q0 p
    数值分析 发表于 2022-9-24 23:047 y; L! M/ ~3 Z$ D) W/ x3 T5 `
    拉下来?拉多少?- G* U; p* A$ v
    把代码贴上来看看?
      a# e' m1 z! s

    0 @2 Q% H! F6 j& ^0 @/ p& }void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    8 D6 k% K6 K: f8 i  x6 m{
    : ?5 A- ~7 G( E$ z  D1 ]        comp temp, xtimesy;7 \1 |/ Z0 |2 S# P
            xtimesy.re = 0;: M- L$ [- j2 K3 f& q# M9 u( d4 D
            xtimesy.im = 0;
    ; W, ~: P! @% e, v3 b        int j0 = lenB - 1;* X& v- P; `; i' t. _4 o( Y8 Q
            int    i, j, i1, reali;
    ) X  t% v4 U. J# J/ |$ ~: B# N        if (lenA % 2 == 1)
    1 X4 y* H  H0 W' G8 n$ T2 b                reali = lenA + 1;, y+ T3 n8 S+ k# z5 p3 C( B
            else
    " E7 A4 @$ X! V% G0 |, V1 b+ f                reali = lenA;/ z3 m: n1 G$ }  z
            reali /= 2;! z2 u; o: F7 |+ E4 ^6 p& o% H

    6 f- m$ i9 x6 R& H        int nconv = reali + lenB;
    3 o* O" }! a" P6 y1 u! \3 s3 F, Q        //#pragma omp parallel for: ]: D0 `' }& }* u! V6 K- M
            for (i = reali; i < nconv; i++)2 y' O4 `. B( |
            {
    5 l) X% P6 X5 p9 e/ a                temp.re = 0;
    8 [$ t+ A" ?% x, k, Z4 E6 e                temp.im = 0;/ j! C% E! `% r- X$ F
                    i1 = i;
    1 i- S( `3 z( q! p                for (j = j0; j >= 0; j--)) U5 z' f# A( s0 t. U+ {
                    {9 X1 X. a7 |7 q- O
                            /* floating date operation */6 S9 b# H  l% Q9 q: O" B
                    }
    4 B2 s8 |( L7 k5 ]' S( D0 I
            }
    6 y8 D. n; b6 p) C. X8 [4 F}4 ]& }/ @2 o2 p  [) ?7 o. R

    - y0 r; ~' F; A5 I$ m; rxcorr函数代码如上,comp是复数struct, 做过长度为11、19两个矢量的测试,和octave结果完全一样
    1 {2 P2 M* o$ L7 E" D! Q6 }$ y8 m3 z# H6 D
    红色部分是内循环,现在其内部操作都comment out 了, j0大概是 6000。
    5 ]( S! i* N* d6 I$ K* T  m$ c' M现在call xcorr 100次,耗时78s.
    7 G3 P9 v+ P6 o
    # L9 D/ Q* x' G如果把红色部分内循环本身完全comment out, call xcorr 1000次,耗时 <1s.
    ' w- G7 W1 a9 Q% W3 k  u+ G
    0 U4 f7 t( R: f! c9 h
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    3 天前
  • 签到天数: 1184 天

    [LV.10]大乘

    6#
     楼主| 发表于 2022-9-25 00:17:17 | 只看该作者
    风雨无阻 发表于 2022-9-24 23:33
    . C; c( G8 U9 T3 kMaybe Debug mode?
    ; ]5 {' e- }) ?7 _! P/ m
    / }3 s5 p2 _6 {! M# q4 c
    不应该,看我上面的回复。! o- M5 W( c* N

    ; p3 g* @4 ^9 A% g2 J1 r我更怀疑是 VS 社区版的问题
    回复 支持 反对

    使用道具 举报

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

    [LV.Master]无

    7#
    发表于 2022-9-25 00:20:10 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 00:24 编辑
    " x  n$ V( [  Y. j/ Q
    雷达 发表于 2022-9-24 23:54
    ! p7 ?6 S  d: A; I/ Ovoid xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    3 W0 w% v( s; _1 M  x6 g  K{
    - V% D+ A$ v7 Q9 l        comp temp, xtimesy;

    . t) m  M7 K9 m3 h
    ; Z: y4 c7 b  z3 l这个不是这么比的吧。。。
    ; ~( Z9 W2 R% P4 |( v; n# D$ z
    . Y- y  d4 c- k. T您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。% @: D  p* ]7 A# v) J
    9 [' Y" o( d0 J, ?
    而加上内循环,光jmp和dec指令就至少多执行了6000个,慢个几十倍不是正常的么?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    3 天前
  • 签到天数: 1184 天

    [LV.10]大乘

    8#
     楼主| 发表于 2022-9-25 00:46:56 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 01:09 编辑 : L' {& I- C/ K# J
    数值分析 发表于 2022-9-25 00:20+ r6 B! `1 ?, K: p1 `. N/ E( ^& M
    这个不是这么比的吧。。。9 m4 c6 [1 @1 a$ E2 L1 [6 ?

    4 O5 ?/ w) ?$ Y9 e( w您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。

    % p+ h8 b, @* G' E' x; _
    ) S! C* ~6 C3 t有道理。
    + w: \  ]  S0 D) N所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,记得 numeric 库里有算向量内积的,我回头试试。% U! V8 o, ~% Q1 e; U/ O
    ) G& ?# M% K2 e3 ^
    我先尝试尽量用标准库,一个小程序,不想搞得太复杂。多谢了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    9#
    发表于 2022-9-25 01:27:53 | 只看该作者
    雷达 发表于 2022-9-25 00:462 m2 i. u$ Q5 d3 p
    有道理。
    . Y5 J/ F& M% l! ?% p. Q所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,这大 ...
    5 R0 C1 ]/ Y/ H& o
    你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子,把循环本身翻译成机器指令loop或dec/jnz,两者速度上会差很多* Y/ p0 Y& X  v, o  A
    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
    . k' j) K8 v8 L/ L8 o( J这个不是这么比的吧。。。
    $ q; Z4 W. K8 j) X1 y+ D+ u
    9 ~0 I1 d& D) z: u您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    而加上内循环,光jmp和dec指令就至少多执行了6000个

    7 e% l& {! I" G. @$ q
    - q0 K0 ]& x4 J$ Q1 z4 Q: t( K! `7 p现在的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 编辑
    4 W* l( z9 S1 C) w6 i; s: T
    沉宝 发表于 2022-9-25 01:48/ E0 R( e% G7 z4 m0 ]8 U" m. r: g
    现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果 ...

    7 ?& O4 }1 P8 |( G1 I  ]) y. s* `$ B5 r# E1 X+ B1 t! H
    是的,兄台说的对。& d- s" `! m/ O) a/ H/ c
    ) [$ p8 w2 D2 [0 s3 G) d8 e
    其实我想说的是 真正数值计算部分和代码中其他不直接计算的overhead的比值这个事儿。
      |9 ?- F7 n5 D4 ?' P$ F" a' m$ q
    雷达兄构造测试用例的时候,屏蔽掉了所有计算的部分,使得剩下的都是overhead,这样run time比较的结果就显得好像不合理了。如果把计算加回去,计算部分的run time会dominate,结果就不那么离谱了。因为不好说,所以用指令数对比的方式试图直观地说明这一点。
    + L7 [2 b8 q6 `( m" U8 Q+ Q
    ' V( s( A& y9 n! Q9 g( C8 o2 ]比如说,如果有计算,那么跑六千个循环相对于计算应该用不了多少时间。但是如果一边是什么都不做,另一边是六千个循环,那六千个循环比什么都不做慢几十倍了,就不是那么不合理了。9 X$ R  s6 t! U& Y8 x+ i  L
    $ k! r; V; r5 m1 G9 F: p
    当然也有可能像兄台说的,是优化参数的问题,但我觉得更多地是测试用例设计的不合理。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    3 天前
  • 签到天数: 1184 天

    [LV.10]大乘

    12#
     楼主| 发表于 2022-9-25 04:47:43 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 04:49 编辑   Q. b* l  l8 l4 p0 P$ q
    沉宝 发表于 2022-9-25 01:27; d; `$ [/ X4 ?6 @' [( l
    你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子 ...
    # S& J9 z4 X7 {- d
    / z, d' a$ Q. F; J# o
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差一倍,我上面这个差的太多了。
    : s# @% x  T' f2 g8 `6 p5 c# c0 D9 R" B/ r# `" `1 }
    我已经完全懵了。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    13#
    发表于 2022-9-25 05:51:23 | 只看该作者
    雷达 发表于 2022-9-25 04:474 ]5 p& R+ R! t9 ~8 j2 e% H+ C
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...
    4 d0 w7 o9 {' i4 T; E" Q( ]- `) V
    时间差一倍的结果可以接受。
    4 c. ~+ o! a3 M% j# z) v6 Z5 Z1 [' \( o
    你还是用profile工具看看吧。现在大家都主观瞎猜。
    回复 支持 反对

    使用道具 举报

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

    [LV.Master]无

    14#
    发表于 2022-9-25 14:58:59 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 15:38 编辑
    3 ~# N2 T7 z% ~9 s
    雷达 发表于 2022-9-25 04:47( v, a+ y3 H9 S% `
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...
    1 v' U# i; U6 ^) A$ M+ I

    9 ]" Z- b3 z% |4 W, |; C2 W* L4 l1 t, D+ m% T4 m% r
    " Q  W  k+ \/ w
    能不能把这个也贴上来,看看和上一个有什么不同?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    3 天前
  • 签到天数: 1184 天

    [LV.10]大乘

    15#
     楼主| 发表于 2022-9-26 01:30:03 | 只看该作者
    本帖最后由 雷达 于 2022-9-27 01:17 编辑
    . O9 z" H% m7 {$ Z$ _& ~' O
    数值分析 发表于 2022-9-25 14:580 Y7 D" ~0 x  F' ^
    能不能把这个也贴上来,看看和上一个有什么不同?
    ' D6 V+ n( s: L0 t( H
    理了理思路,重新做了一个测试。2 v- ~; b9 ^1 y. q' k
    做了两个 vector 和 两个 float *, 都长 1000007 d8 I  E2 f+ H
    外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
    * p' n+ N/ L1 J  e0 [# f# E7 r" J- E2 N/ i9 ?1 k$ @
    内循环试了4种方法,9 ]# n; U7 r* e' F
    1. 直接调用 vector inner_product 247s
    * f3 I" d4 b/ [- `( K3 j2. vector 循环点乘累加 237s
    " |* L1 [3 @/ V! P; S3. float * 循环点乘累加 204s
    - g# d; ]; F* g4. 空循环 100000 次 202s/ G2 y5 }! y* V+ D2 v9 g

    $ w% s# h" C! @不做内循环 200s: G; s8 E7 L4 l0 g3 C5 r- k1 g

    3 p( _7 F( f: g' e! R2 ~: ^& F你昨天说的对,内循环本身占比是很小的,大头在其他处理。% F$ R4 O( N( C
    另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。# Z, J$ q$ P/ y$ U- ~5 _

    0 ?8 o9 \( R6 t3 C至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)5 X3 k- S5 \; V; x: s2 Q

    1 S3 a+ M3 I7 K8 C5 p" M4 n# y(为什么下面我贴的  b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成  jj 好了,原来 方括号里的 i 是斜体标志  LOL)* T1 u8 S- k* y9 Y' v

    ) t: I  |5 Z' g7 y2 P
            std::vector < float > vec1(N);$ A% E$ y0 r2 C2 N$ L
            std::vector < float > vec2(N);' K/ S. P* j# `. A3 T0 e! o
            float* b1 = new float[N];, Z$ h9 ]: U7 M: u8 R
            float* b2 = new float[N];5 f' ^+ {  b! w! H! m0 D

      P6 ~$ L4 U& ]6 y        for (int j = 0; j < 6000; j++)7 ~0 J: [( @5 R6 _5 P
            {0 o0 N- \/ H. B3 h
                    std::generate(vec1.begin(), vec1.end(), []() {1 _) _1 [6 M: z5 h/ f$ Z7 v
                            return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
    2 n6 K" {0 a$ E1 c3 f6 {2 J3 ~                        });
    ! N% g- j8 Q6 H% ^: [3 t% |
    ! m: P- o! P9 I                std::generate(vec2.begin(), vec2.end(), []() {8 `3 T4 O( u8 S2 R( z- c) \: |
                            return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;$ o4 t$ }3 c4 S; B5 [. o
                            });/ O9 f5 ?, G9 Z8 ~! [

    * C2 _( u& t! ^                for (size_t jj = 0; jj < vec1.size(); jj++); s( u# _# b0 r, u' ?& u
                    {
    ! m5 r0 k: n6 o                        b1[jj] = vec1[jj];
    9 X8 a6 F" Z5 {9 k0 T9 ^                }. o8 m: V; b2 h: C/ [7 Q( c
    + y6 S3 I4 y% p6 d
                    for (size_t jj = 0; jj < vec2.size(); jj++)
    2 f, p! g. G9 Y4 n                {
    / o. ?' z& ?/ o: B9 i7 O                        b2[jj] = vec2[jj];
    9 r0 q% K* w2 r; u" x                }
    , p6 h" e. i2 X
    8 J  h. ?- E: C$ }                //Method - 1  N=100000 247s  & z$ G; p: r2 V/ K: l! n
                    //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);6 h, `- r; M+ L' G* i0 [
                                    
    # h* p" j- b: @# [/ t9 ~" E  e                //Method - 2  N=100000  237s
    2 F6 G! e8 N/ G/ D1 c1 f+ Z  U2 t                /*. ]( l/ S- {1 t+ S% T: i( D
                    for (int jj = 0; jj < N ; jj++)5 _# N! e2 |0 x1 C/ K. o! k" t# }
                    {/ P2 j0 S: X9 _7 p
                            fresult += vec1[jj] * vec2[jj];
    5 N; f! ]7 r2 n. p+ H- e                }
    2 K) \3 [/ i% t1 D. b$ F" Y, A  b                */$ T, ^- C- q9 L" G! g; r
                                    # Z- @. |# V0 e) g8 v$ x' _8 v2 W
                    //Method - 3  N=100000 204s
    7 |* `5 |' C1 V" X. b                /*
    " J$ D$ U$ G6 V. p/ H/ F                for (int jj = 0; jj < N; jj++)
    ' G# R6 u6 B' K1 z% A3 |                {
    5 l. c# ~. [3 q6 o" F2 e; j                        fresult += b1[jj] * b2[jj];
    2 O' ?+ W2 R4 ]5 M7 W/ g                }
    / H; b) C4 b! p+ Q+ C4 C                */+ I+ O8 _' x" ^
    8 O  u" r3 k3 Y; j
                    //Method - 4   202s
    4 n- p* `$ A2 H0 `( D5 R, y" L                /*/ X7 q1 N+ P8 M/ v: y9 p
                    for (int jj = 0; jj < N; jj++)
    . k* d0 p! u8 p2 v                {& J; U. P  R4 O  Z
                            
    2 i6 P/ y* m" U                }# a7 i: Z) I6 f
                    */3 {, \/ R* ?( d2 Q2 l5 O
                    //comment out all methods, N=100000  202s                . C8 H2 P4 l) W% \# J' k
            }
    0 K; t: z/ [: x, h! b8 g* v6 a. S8 H" p. \0 f2 ~4 L
            delete []b1;
    8 m) J5 ^. N; t& K: C* `        delete []b2;
    ; V8 c) a. E0 Z+ r& P
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    16#
    发表于 2022-9-27 00:15:38 | 只看该作者
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?9 z2 L$ |6 g  f8 @! x
    / k2 E) z! h# q, K
    你第二个试验里面的j在循环里面又重新定义了啊,你确定真的跑了6000次?
    8 ^8 G) V' D+ |
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    3 天前
  • 签到天数: 1184 天

    [LV.10]大乘

    17#
     楼主| 发表于 2022-9-27 01:16:03 | 只看该作者
    机器猫 发表于 2022-9-27 00:159 ^' ^& J7 t' N/ Z6 H$ n
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?( Z# e4 _) z5 F7 |1 ^: W0 n/ d9 `

    ' R8 J/ `9 g5 {$ _* W你第二个试验里面的j在循环里面又重新定义 ...
    " D  N- r' y' u
    内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL) H, v4 e9 l. D
    2 v; K- t! w& O. R; e! p
    不和它较劲了,瞎耽误工夫,我已经转到 ubuntu, 也准备顺便试试 avx2 向量化。
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    18#
    发表于 2022-9-27 02:06:58 | 只看该作者
    雷达 发表于 2022-9-27 01:16; `% n3 c" _: L% M0 d& S
    内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL
    2 c: B1 ]  Q$ [' e0 B0 L9 E. F( X7 M) b* O4 r/ \
    不和它 ...

    % j9 D  ~4 N/ Y9 d  A. G- N2 G3 c% ^3 y8 l
    不过可以试试我说的register变量。前一个试验j是混在一堆其它变量里一起定义的,很有可能是在stack上,这样内存读写会更多,要是再碰上每次都需要加载cache就更慢了。  b# M' W; F1 W) E& J! Z0 U
    后面一个是在循环那里定义的,说不定编译器就把它优化成register变量了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

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

    使用道具 举报

    该用户从未签到

    20#
    发表于 2022-9-27 20:29:50 | 只看该作者
    雷达 发表于 2022-9-24 23:54
    ! v$ z4 d- Z) S- ?9 O# N! @void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    ' V1 Q# C2 v! {- |% @7 |{2 p2 Q( J/ y! Q( ?% U7 W& n
            comp temp, xtimesy;

    1 y! h" q, [  |- V  Z- S这个code里面如果Openmp没有被注释掉的话,那么temp那个变量应该是定义在循环里面,否则线程之间会存在争夺写入那个temp的风险。5 j( h" Y& r* k9 o8 m4 o. \9 I! \& I
    内层for循环如果没有内部操作的话,编译时应该被优化掉了,和你完全注册掉整个循环是一回事。可能你的编译设置没有打开优化?
    - b& N) ]; i* v8 z, UVS社区版没有问题,我工作用的就是社区版,设置正常的话不会比商业版差。以前游说头头用Intel Compiler,他说不想花钱,而且差不了多少,就一直用到现在。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2026-10-20 09:21 , Processed in 0.067980 second(s), 19 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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