设为首页收藏本站

爱吱声

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

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2022-9-24 22:54:26 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
    C++ 比 Octave 慢好多,怎么破?. x. x4 U% ~- C6 K- ?1 Y! V- d& k
    4 G6 ~8 o& t, d6 p6 S
    自相关两层循环,内层循环涉及浮点数计算,试验了一下把内层循环内部全都 comment out 只留个壳子,  但空的内层循环本身就把速度拉下来了,看来问题并不在浮点计算。
    3 D! O: |/ o+ C) {1 ?9 G
    . q  U1 ]0 r' j, O% h1 x速度优化问题真的很有意思啊。: [. d6 f; |# l/ t7 s2 E& |! ?( e& \

    ) y5 B, G4 N) I欢迎大家继续讨论

    评分

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

    查看全部评分

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

    [LV.Master]无

    沙发
    发表于 2022-9-24 23:04:16 | 只看该作者
    拉下来?拉多少?
    6 `( @" t8 z1 k% E3 J把代码贴上来看看?
    ( Q) `0 _& C$ X. H' l
    1 T' k; C$ D' {: ]$ t" B1 Y难道分支预测不准破坏流水线执行?不该啊。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    板凳
    发表于 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 编辑
    5 l& c( p" t& N$ i* m& h; c% g- j
    数值分析 发表于 2022-9-24 23:04
    - z! u0 f2 i2 ?  c9 {! D# `* \拉下来?拉多少?
    1 ^: `6 A& l- x" S把代码贴上来看看?

    2 G0 U$ o0 M9 e7 I- k% Y& X/ h3 |0 o  x0 z; `7 r' B: e& N
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    ) b6 b/ S; E8 n# Q5 t{3 ]0 b, Z! P  X6 Q1 ~. z7 M/ C& e) ^
            comp temp, xtimesy;
    ; n! m  d7 D1 p; w8 }* k- F        xtimesy.re = 0;' Q4 ?3 C. }; U) ~- H
            xtimesy.im = 0;7 k- T- Z) O3 q) f, t8 D$ r4 Y8 M  l
            int j0 = lenB - 1;
    # ]- c2 ^- q4 f' ~* c        int    i, j, i1, reali;
    6 E# L3 ]9 @3 g# w/ b' B" W& D        if (lenA % 2 == 1)
      f: b2 p2 i/ w; Z0 d0 ?7 i                reali = lenA + 1;/ {3 j; z0 {4 y; s8 x6 L
            else& ?' f5 @3 ?: r: @8 m, l2 D
                    reali = lenA;! C) ~9 d' ~" A1 R1 S: R
            reali /= 2;
    + N+ ^, d! N5 f7 A! w
    ( i" t& }2 x5 i  t$ I. L        int nconv = reali + lenB;6 X5 j- [5 g. P  W! S3 E
            //#pragma omp parallel for  l7 O+ P# o, m% K
            for (i = reali; i < nconv; i++)
    4 {+ E: V% q% {& V5 I' @% _' @        {. S( t  y9 P0 |8 r  `
                    temp.re = 0;
    % s1 d3 j1 y8 p                temp.im = 0;
    ' ~% w$ b, Q  Q5 D2 c                i1 = i;2 X  n; i/ Q% |7 J* |
                    for (j = j0; j >= 0; j--)3 B: ~; B9 ]/ A
                    {
    ' K$ M- Q( e5 e5 w                        /* floating date operation */$ i. a# Y  U4 Q
                    }

    3 X. d6 s3 r. k% H        }4 M9 A2 I, Q4 b! S1 Q! c9 Q
    }
    5 Q7 S: t* R/ k5 G% ?9 I: L( q8 B. Q( e, Y7 ]% f
    xcorr函数代码如上,comp是复数struct, 做过长度为11、19两个矢量的测试,和octave结果完全一样6 n8 g4 N$ a# X3 y

    $ S0 S, ~4 k- w2 ^; R8 N5 @9 j红色部分是内循环,现在其内部操作都comment out 了, j0大概是 6000。9 x9 F7 I( H% n/ B
    现在call xcorr 100次,耗时78s.) {, t4 E& ~- I" x* x0 T8 C

    4 s# u5 L2 c7 z( [: @, z$ x) n如果把红色部分内循环本身完全comment out, call xcorr 1000次,耗时 <1s. ; z2 ]5 F/ c+ b' K, k6 @/ G

    5 |" _, @9 E" l) G
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    6#
     楼主| 发表于 2022-9-25 00:17:17 | 只看该作者
    风雨无阻 发表于 2022-9-24 23:33
    0 w% y, m( w% Z: y* XMaybe Debug mode?
    2 g+ ?  a) K+ N8 X1 P

    & w# o: m; n+ A  `4 ^$ L不应该,看我上面的回复。
    # r1 R$ M  X5 d1 m( i* y# E( e2 e9 W0 i0 n
    我更怀疑是 VS 社区版的问题
    回复 支持 反对

    使用道具 举报

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

    [LV.Master]无

    7#
    发表于 2022-9-25 00:20:10 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 00:24 编辑
    ' Y. G3 o' C9 D
    雷达 发表于 2022-9-24 23:54, k; u2 T" E  j; F- `9 U  G) g
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    & e9 O# U( d5 `& A  r{  G2 X# Y. l3 |$ h8 b# j
            comp temp, xtimesy;
    & g8 R, P8 `5 T

    % H3 p8 h6 v; A/ V) W这个不是这么比的吧。。。
    6 H3 K0 x& L3 }  \8 M# c. N. e7 Z  M
    % d9 _0 L8 J5 x6 q' X. v  z% s$ c您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。5 s+ c( v1 {/ u7 ~9 d1 `" N
    " H! A0 v2 e2 t, |( C9 Z8 i
    而加上内循环,光jmp和dec指令就至少多执行了6000个,慢个几十倍不是正常的么?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    8#
     楼主| 发表于 2022-9-25 00:46:56 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 01:09 编辑 ' i6 E, c6 f* B
    数值分析 发表于 2022-9-25 00:20% O  i2 [. j* c& \( m6 t4 h$ P( D
    这个不是这么比的吧。。。% Q+ R- z% t1 @  t6 i/ Q
    ! Z1 M1 O% u  }3 t
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    # ]# y/ o; d( M: x1 k% D( N' u

    ) h- j, T" T! t, G有道理。
    7 X; Q* C8 B" o8 b" x+ q* q" U所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,记得 numeric 库里有算向量内积的,我回头试试。
    9 j: H; t/ o+ u5 c# r
    8 g& n1 d% r0 B$ l我先尝试尽量用标准库,一个小程序,不想搞得太复杂。多谢了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    9#
    发表于 2022-9-25 01:27:53 | 只看该作者
    雷达 发表于 2022-9-25 00:46+ K, q$ D' [$ ^
    有道理。2 Y+ _. H0 k. y: E) @4 |
    所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,这大 ...

    / U4 c$ e: I1 G你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子,把循环本身翻译成机器指令loop或dec/jnz,两者速度上会差很多3 U3 F5 ?8 \; J8 }4 G% 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:207 b8 q6 d2 u" Z
    这个不是这么比的吧。。。
    ; s1 R5 P6 {/ W4 Y2 V' N% }7 q+ \) F- A1 B
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    而加上内循环,光jmp和dec指令就至少多执行了6000个
    5 ~; V" D4 E. _9 N

    & i( |1 k. O/ h现在的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* C: Q$ S0 {% B; \) Q* \
    沉宝 发表于 2022-9-25 01:48
    . _! e1 T" M+ S5 j7 p! ]* h现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果 ...

    ' ?3 t) S8 V3 h$ w9 t0 i5 b( y4 [- Z; n; H
    是的,兄台说的对。- F; K5 V2 x  {" u& ]
    ) k* a+ d0 J# f( `8 o5 K
    其实我想说的是 真正数值计算部分和代码中其他不直接计算的overhead的比值这个事儿。
    ' W5 T8 X4 u) I& ^) Y) @' R# b
    雷达兄构造测试用例的时候,屏蔽掉了所有计算的部分,使得剩下的都是overhead,这样run time比较的结果就显得好像不合理了。如果把计算加回去,计算部分的run time会dominate,结果就不那么离谱了。因为不好说,所以用指令数对比的方式试图直观地说明这一点。
    , @& ~0 y8 M" i$ C8 ]6 {0 B, H& N4 _" n& ?3 d5 k' }% I4 Q  y
    比如说,如果有计算,那么跑六千个循环相对于计算应该用不了多少时间。但是如果一边是什么都不做,另一边是六千个循环,那六千个循环比什么都不做慢几十倍了,就不是那么不合理了。) O0 f7 {: |2 `8 m% \9 m
    2 e* H! c  X( o% g& K
    当然也有可能像兄台说的,是优化参数的问题,但我觉得更多地是测试用例设计的不合理。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    12#
     楼主| 发表于 2022-9-25 04:47:43 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 04:49 编辑 + A# t) |* U8 i3 L' z# X" V5 _; {+ C
    沉宝 发表于 2022-9-25 01:27
    / E- s/ ]- R' I  ^: ]& p- d你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子 ...
    3 z5 W+ F+ T9 ]( ?

    , {1 Z# ^  q! g! N8 M) _又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差一倍,我上面这个差的太多了。' c+ Q# ?9 v; u$ a7 y6 s6 l1 K( \0 ]" |3 t

    7 L  p- V4 x' I: t7 W6 `7 ^我已经完全懵了。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

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

    % ^) M6 R9 b4 k( n" |1 b时间差一倍的结果可以接受。3 N+ G: l5 M- H1 e" w# D" M
    - c: J& B- B0 ]
    你还是用profile工具看看吧。现在大家都主观瞎猜。
    回复 支持 反对

    使用道具 举报

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

    [LV.Master]无

    14#
    发表于 2022-9-25 14:58:59 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 15:38 编辑
    , ^- Z+ J  P. ?& H0 b% ^# R( s5 C
    雷达 发表于 2022-9-25 04:47
    . t' r$ M, s' r. X" J4 ^" g又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...

    . s* j# O5 `. ?, r3 c/ W- e7 _+ _
    3 ?. s: |8 l; l% |5 N

    4 c; v* W! B# I9 `  [能不能把这个也贴上来,看看和上一个有什么不同?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    15#
     楼主| 发表于 2022-9-26 01:30:03 | 只看该作者
    本帖最后由 雷达 于 2022-9-27 01:17 编辑
    3 W! p% M5 _( P8 U* f% q6 f, r9 \
    数值分析 发表于 2022-9-25 14:58
    & y: o5 q; _: B; x能不能把这个也贴上来,看看和上一个有什么不同?

    $ [  d' y& I7 J8 }3 [; J理了理思路,重新做了一个测试。
    0 P& J. c$ }; x; q5 |7 C- _2 Q% x. _做了两个 vector 和 两个 float *, 都长 1000004 Q% u$ w0 B& q6 U
    外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache., A. a) i( s" g  D7 Z# x* P/ ~" q( Q5 z: _
    ' f( v( ~/ x1 M" T
    内循环试了4种方法,9 ]4 [8 {' O; o! P: l, Z+ @2 f" K
    1. 直接调用 vector inner_product 247s " i8 p' ^; M* a+ e/ i
    2. vector 循环点乘累加 237s! O! ]. }. p" g, Q8 |* o
    3. float * 循环点乘累加 204s
    % g2 T+ P( a$ j' ?4. 空循环 100000 次 202s
    ! D: L6 j# F4 s2 V$ R
    ' B4 [, }+ W1 o; l3 b1 _) }% e不做内循环 200s% t+ V' s$ o- v" ~; |2 [  S
    1 x; N" y7 b" v; f3 |3 e3 V/ {' [
    你昨天说的对,内循环本身占比是很小的,大头在其他处理。2 X9 J) H! D: l0 N2 w! G3 c6 F
    另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。0 @( r3 c6 N* c" f- @0 \) d
    0 S& a  z1 j! z9 A2 G$ y8 k5 b
    至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)+ K, J3 h! {3 w: s- T
    & X! a; `  V6 p, D; k
    (为什么下面我贴的  b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成  jj 好了,原来 方括号里的 i 是斜体标志  LOL), M7 M0 _" b" L! G% x

    $ \0 U  |, _1 V5 V
            std::vector < float > vec1(N);* A. \* M8 f& D+ {! e0 }5 N$ o+ o
            std::vector < float > vec2(N);
    - p8 o8 x5 Q) d+ ?/ T        float* b1 = new float[N];/ {8 F) W, T+ ^
            float* b2 = new float[N];) v: J7 O' z# P" p

    ! p2 q& Q( g9 z/ b. C        for (int j = 0; j < 6000; j++)0 r. l  c, ~2 x% \
            {% p6 t) t, L9 N( q2 }- C5 F
                    std::generate(vec1.begin(), vec1.end(), []() {
    0 n# ~) e' C+ E( s' `6 R7 _4 w1 [                        return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
    ( f6 b4 b8 T. h8 D$ P! y" k                        });; @  g* |; r6 a. k* p
    3 @* ^! r, Z- Y7 n. v
                    std::generate(vec2.begin(), vec2.end(), []() {# D, Q9 g8 L5 D
                            return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
    0 y5 T- L8 W: G% q- }4 x                        });3 a( F" H7 h& x

    , t1 ]4 v% W. u' t3 ~2 {: ~                for (size_t jj = 0; jj < vec1.size(); jj++)9 U8 d9 i: w+ Z
                    {- v$ G  q+ `9 o9 p3 k( _
                            b1[jj] = vec1[jj];( s) E  R; ^4 H
                    }+ ^+ V3 u  |8 W( e: K" T) `. F
    : h) _/ n1 D4 p" k3 J
                    for (size_t jj = 0; jj < vec2.size(); jj++)3 x2 M" j6 G- ]0 c
                    {
    1 o2 ?) H# y8 c& ]4 E5 p                        b2[jj] = vec2[jj];
    - L2 q, Y( C- l3 O" P) i  r                }
    * R, O2 W; i5 d. G1 [* I) P3 Q- H; i
                    //Method - 1  N=100000 247s  9 v" I# K( T5 _, ?
                    //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);+ X3 _3 z  Q% \
                                    
    " I% e* n- `" z2 m; K2 L                //Method - 2  N=100000  237s* V$ Y3 K  {% Q: @2 @
                    /*; q; N6 c9 M, o; z# P3 D# Q* U  E
                    for (int jj = 0; jj < N ; jj++): J% @& K: {0 K  Q( E1 ~* ^+ X! D
                    {1 @# ~! \8 i+ z# x
                            fresult += vec1[jj] * vec2[jj];
    ' B/ b7 X2 _& C                }
    ! q- d( v* Q" Q1 ~! s* l0 a                */
    " n: j: l# H6 r                                
    % j, K! C% t9 b4 X                //Method - 3  N=100000 204s
    * m% P( k4 @. h9 F2 c                /*- t+ _+ W* b7 n0 w! t# R
                    for (int jj = 0; jj < N; jj++)" a4 ]5 p) j" A" y7 V0 ]
                    {
    3 B/ o" \: O9 m! n0 G9 b, S; J                        fresult += b1[jj] * b2[jj];
    6 k% l& k2 q  `2 J  G* q3 [                }
    " F* `) R( X, e! @                */
    7 q7 Z& C8 ?. ]; q8 u  ?
    8 B: E- a( ]9 |. r. I6 S6 _                //Method - 4   202s
    0 n( z0 O8 h9 ]4 X                /*
    9 o7 A; p3 v6 S1 u& ]# U2 f                for (int jj = 0; jj < N; jj++)
    $ l9 ?% B0 ~/ J  u' Q4 F  c( e9 X" P                {
    9 r3 M% N* P7 q  w6 f# }* V                        
    6 y/ K+ X; \% q5 S0 Y                }+ {" \5 v" P, J( y
                    */: q4 b; V% S8 N
                    //comment out all methods, N=100000  202s               
    8 d8 L/ m+ u- U. o+ `- p5 i5 o        }
    + i* g* |% y: c6 \7 @& S- T! A$ j2 V& E7 V
            delete []b1;) f! q0 \# I) A+ s, _
            delete []b2;

    * S. @5 B; G3 P7 `/ Z
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    16#
    发表于 2022-9-27 00:15:38 | 只看该作者
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?5 Q' }# B! L: T& d9 C9 V
      n* w! P7 c+ C3 w+ F1 P, k
    你第二个试验里面的j在循环里面又重新定义了啊,你确定真的跑了6000次?3 [: M' A$ y3 ~1 G
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    17#
     楼主| 发表于 2022-9-27 01:16:03 | 只看该作者
    机器猫 发表于 2022-9-27 00:15. }, p4 t6 n+ e/ D
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?6 w# O8 e2 d7 [9 }- E  I

    & Y6 u" t5 G  Z+ m* J你第二个试验里面的j在循环里面又重新定义 ...

    : Y' E- N! l3 L) J- C内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL4 _- [2 D% |0 X/ b" x  I' I
    2 t; k$ M% Z" a& f+ Y+ b# o4 b9 q
    不和它较劲了,瞎耽误工夫,我已经转到 ubuntu, 也准备顺便试试 avx2 向量化。
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    18#
    发表于 2022-9-27 02:06:58 | 只看该作者
    雷达 发表于 2022-9-27 01:166 @8 ?. A0 \6 p0 \1 r6 A' d
    内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL
    8 S9 P! |* i- W1 d' A" \: y
    7 B6 T8 [8 v( x不和它 ...
    3 }" k7 ^  A3 R  ]

    1 h6 q' R. u, \) a8 }$ M  u  c0 T不过可以试试我说的register变量。前一个试验j是混在一堆其它变量里一起定义的,很有可能是在stack上,这样内存读写会更多,要是再碰上每次都需要加载cache就更慢了。
    ( c* h! _$ {, r; Q9 C" }后面一个是在循环那里定义的,说不定编译器就把它优化成register变量了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

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

    使用道具 举报

    该用户从未签到

    20#
    发表于 2022-9-27 20:29:50 | 只看该作者
    雷达 发表于 2022-9-24 23:54
    ( ^7 d6 e+ y+ m0 Y8 D) R* ]! r2 i$ Evoid xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    : T7 T. {! d8 j9 W{( ]- ^5 [8 v. C7 d8 g3 Y  @" R
            comp temp, xtimesy;

    ' _$ g$ l$ B1 `8 k这个code里面如果Openmp没有被注释掉的话,那么temp那个变量应该是定义在循环里面,否则线程之间会存在争夺写入那个temp的风险。. L) P; Q) C* h6 R2 E
    内层for循环如果没有内部操作的话,编译时应该被优化掉了,和你完全注册掉整个循环是一回事。可能你的编译设置没有打开优化?
    + ~* Z  ~' Q' XVS社区版没有问题,我工作用的就是社区版,设置正常的话不会比商业版差。以前游说头头用Intel Compiler,他说不想花钱,而且差不了多少,就一直用到现在。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2026-9-5 20:59 , Processed in 0.069187 second(s), 19 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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