设为首页收藏本站

爱吱声

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

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2022-9-24 22:54:26 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
    C++ 比 Octave 慢好多,怎么破?8 p2 E/ k$ D- ^: W0 `& \9 X

    8 j8 }8 h) E8 E* d自相关两层循环,内层循环涉及浮点数计算,试验了一下把内层循环内部全都 comment out 只留个壳子,  但空的内层循环本身就把速度拉下来了,看来问题并不在浮点计算。
    6 a7 ^/ C3 K, i8 W8 Z
    0 G' q2 e; S9 e' J9 Y+ [速度优化问题真的很有意思啊。
    0 ]3 L3 t. k4 z3 O/ @
    * h/ I" m  E3 N2 b% E! _6 K% r6 Q欢迎大家继续讨论

    评分

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

    查看全部评分

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

    [LV.Master]无

    沙发
    发表于 2022-9-24 23:04:16 | 只看该作者
    拉下来?拉多少?: P1 D! w4 f1 Q! y* W* V/ ~1 X# s
    把代码贴上来看看?( F. ^$ `7 T8 A$ Z: J. Q9 q
    2 u: u6 F$ o- J! s
    难道分支预测不准破坏流水线执行?不该啊。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    板凳
    发表于 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 编辑 ( l# z$ Q- I/ O, J
    数值分析 发表于 2022-9-24 23:04
    1 V* l% |- R7 n2 @# N; B# A" U拉下来?拉多少?
    ( Y& |; T/ H6 ~# L4 e+ q1 w5 I把代码贴上来看看?
    ' j1 k8 F6 S: n% S4 E0 h( r8 t

    : z( _" v' ^4 G8 @void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB), X1 U* W6 C) G4 ?9 U
    {9 r# ]2 z# C. n, }5 V  v" @" l! q. D
            comp temp, xtimesy;( ^" E0 T8 n& Q6 {$ M# M) W
            xtimesy.re = 0;/ q# U& T, d! K7 I6 u
            xtimesy.im = 0;
    3 ^& U6 y: _( e        int j0 = lenB - 1;
    ' j( t; P$ z. C        int    i, j, i1, reali;
    0 H" M9 n# w; r- a2 V7 k, }- U* c        if (lenA % 2 == 1)
    % y# A9 d! c) R& D, ^/ x* S                reali = lenA + 1;( j. U8 J- W' w  ?
            else
    ! g6 ~1 C  x" q+ h. ]                reali = lenA;; _( _6 o: l% w  i
            reali /= 2;
    ! u" Q' g$ V5 ~6 V- l! Y: T' q' ]
    . Q% e; g  S' N        int nconv = reali + lenB;
    : N: o9 r8 `  G* p' E/ f        //#pragma omp parallel for* K! N3 j6 f7 _- W4 r1 l& H* T
            for (i = reali; i < nconv; i++)
    ; s0 D# Z  ^  j$ ?3 a" C        {: C0 r% p# d& @8 `0 ?
                    temp.re = 0;
    & U$ v. Q' P3 O# ]$ m                temp.im = 0;5 J/ w) i1 d2 V( l7 f
                    i1 = i;" k9 T9 A3 P. ~6 e. Q
                    for (j = j0; j >= 0; j--)
    : H. z3 p5 ^! k, E7 b2 y6 b                {4 N7 H* ]% K6 V4 ]# d4 \
                            /* floating date operation */
    : ?  [) P/ P" g, j- v/ F( ]: ]                }

    $ X  A) p9 F% f/ L" v# J# l        }
    ( \2 ]) C0 s% J2 E; l}$ g3 n4 y% z& L

    , f- w! Y  n* Axcorr函数代码如上,comp是复数struct, 做过长度为11、19两个矢量的测试,和octave结果完全一样
    2 l0 c# T6 w% T9 T- I2 Z3 [# D2 p+ O" C- [3 M' r) v, P" ]; z- M
    红色部分是内循环,现在其内部操作都comment out 了, j0大概是 6000。& H+ d% P/ N: [
    现在call xcorr 100次,耗时78s.- H$ H- R. j; B  r
    ! M, f7 O* J" k% L' j1 H* z' U% W, j
    如果把红色部分内循环本身完全comment out, call xcorr 1000次,耗时 <1s. 9 \* H5 u# a$ o! i* J& _3 c
    , o7 C6 w1 d9 C  V: o
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    6#
     楼主| 发表于 2022-9-25 00:17:17 | 只看该作者
    风雨无阻 发表于 2022-9-24 23:33
    . }- B* O; ^1 t% ]6 d) MMaybe Debug mode?

    7 X5 C) e5 @; z
    1 Q; o5 u9 l8 V- p不应该,看我上面的回复。
    1 D& P1 \! {, ?* n9 X
    1 Y( I7 ~4 Z* h5 s1 m7 I我更怀疑是 VS 社区版的问题
    回复 支持 反对

    使用道具 举报

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

    [LV.Master]无

    7#
    发表于 2022-9-25 00:20:10 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 00:24 编辑
    6 ?* s9 f/ _& \  K
    雷达 发表于 2022-9-24 23:546 M9 A  t" S& X# q7 [0 t
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)- o/ n" _" Q8 ~7 |& A
    {
    5 L% u6 A; U7 [: |        comp temp, xtimesy;

    0 V* _4 y7 F8 Y# o4 l! P% K! M( {- S
    这个不是这么比的吧。。。
      H1 i3 f0 {; A, Q& v0 h8 ]4 Z% p: v2 E
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    3 z6 X1 ^1 R' ]* x! d8 }
      h0 ?* A0 Y* h/ k9 {1 y# h而加上内循环,光jmp和dec指令就至少多执行了6000个,慢个几十倍不是正常的么?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    8#
     楼主| 发表于 2022-9-25 00:46:56 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 01:09 编辑
    + v( j6 P2 E3 O9 e' L5 S# {7 W
    数值分析 发表于 2022-9-25 00:203 z# n2 g) Y2 R& w3 O
    这个不是这么比的吧。。。
    * i  h4 u3 o' L, {
    2 y: O. |3 h& q5 @您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    4 W) T& z/ ?: z& u

    / F4 b/ _1 \$ p2 _8 ]6 a# e有道理。! {& ]) u! [8 t: ]; e  U8 f
    所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,记得 numeric 库里有算向量内积的,我回头试试。* W7 _5 [: Y" N! D/ H+ `! A  S2 h

    9 t) u: a: d0 {$ M& O我先尝试尽量用标准库,一个小程序,不想搞得太复杂。多谢了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    9#
    发表于 2022-9-25 01:27:53 | 只看该作者
    雷达 发表于 2022-9-25 00:462 G" M, U, U7 g* q
    有道理。& L6 l4 o( C7 b1 G
    所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,这大 ...
    ' a% R$ F  }+ u7 b& I
    你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子,把循环本身翻译成机器指令loop或dec/jnz,两者速度上会差很多% z9 c5 L& E) E6 L) p) W
    Why is the loop instruction slow? Couldn't Intel have implemented it efficiently?
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    10#
    发表于 2022-9-25 01:48:51 | 只看该作者
    数值分析 发表于 2022-9-25 00:202 r+ S# r* C7 r- e8 M
    这个不是这么比的吧。。。
    : d5 j& U7 l( F9 b- H. `  P7 J+ f, X0 ?
    " R" N( s& O8 C& T6 h, f5 d您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    而加上内循环,光jmp和dec指令就至少多执行了6000个
    ' F5 [) W8 A; s3 L& [. B

    ) p" X2 e1 X2 b现在的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 编辑
    % J0 A( I2 I7 ^* U0 U
    沉宝 发表于 2022-9-25 01:480 E4 w# D" A+ D" a. u/ p0 e8 X
    现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果 ...

    ' I! k1 e3 R( Y9 W) c3 M$ G  A) V( _4 `6 b
    是的,兄台说的对。5 n5 p; L! @# D/ B
    - e5 k+ H2 p) _8 c
    其实我想说的是 真正数值计算部分和代码中其他不直接计算的overhead的比值这个事儿。
    1 k3 m3 w; i! g5 r6 W
    $ V0 y. }, Q0 k( `  Q雷达兄构造测试用例的时候,屏蔽掉了所有计算的部分,使得剩下的都是overhead,这样run time比较的结果就显得好像不合理了。如果把计算加回去,计算部分的run time会dominate,结果就不那么离谱了。因为不好说,所以用指令数对比的方式试图直观地说明这一点。
    7 q# q8 ^' F$ b- z% i7 H7 @
    . M# x, n  H$ T6 A& I比如说,如果有计算,那么跑六千个循环相对于计算应该用不了多少时间。但是如果一边是什么都不做,另一边是六千个循环,那六千个循环比什么都不做慢几十倍了,就不是那么不合理了。+ S& M! K) C2 Z2 h$ n: U

    9 G& `6 ?7 V: s4 r5 Y" S% A0 }! p当然也有可能像兄台说的,是优化参数的问题,但我觉得更多地是测试用例设计的不合理。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    12#
     楼主| 发表于 2022-9-25 04:47:43 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 04:49 编辑 ! m. L; l3 P; ]9 `6 }# I
    沉宝 发表于 2022-9-25 01:27
    $ h4 r0 @( C* U3 ^4 q+ j你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子 ...
    8 Y0 Q6 v2 |; k0 u! ^* `$ N

    ; g- u3 T$ p0 G8 Q' p) D又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差一倍,我上面这个差的太多了。5 G5 s" y; z7 t9 a) h6 R

    - J0 }0 D; a" m# u我已经完全懵了。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    13#
    发表于 2022-9-25 05:51:23 | 只看该作者
    雷达 发表于 2022-9-25 04:47
    1 ?9 B3 L% U5 v7 A1 f( h又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...
    ; J; u1 I, L( H% K. S2 Z( @; Z
    时间差一倍的结果可以接受。
    , `; U7 h- l0 {8 o$ `. p8 t3 G, T2 y5 J
    你还是用profile工具看看吧。现在大家都主观瞎猜。
    回复 支持 反对

    使用道具 举报

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

    [LV.Master]无

    14#
    发表于 2022-9-25 14:58:59 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 15:38 编辑
    - {: D0 ]( T/ G" q2 e! P
    雷达 发表于 2022-9-25 04:471 Y7 F7 c/ L6 L0 p( p
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...
    1 M- }! u6 c+ U+ G0 K, w

    9 i. N8 T8 P. U( p
    ) d6 d) F5 p; D4 O' v, R- Y! ]3 V8 l
    能不能把这个也贴上来,看看和上一个有什么不同?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    15#
     楼主| 发表于 2022-9-26 01:30:03 | 只看该作者
    本帖最后由 雷达 于 2022-9-27 01:17 编辑 ) o. @% m) \0 g/ u* l! c8 M
    数值分析 发表于 2022-9-25 14:58
    , l. ?; F. ?7 _  s, o4 ?, M  b* S! X, m能不能把这个也贴上来,看看和上一个有什么不同?
    ' \/ D7 s) T. W8 c& ^9 d; s
    理了理思路,重新做了一个测试。& }6 @& p4 f. b# L0 f6 {
    做了两个 vector 和 两个 float *, 都长 100000
    4 Z# q$ j/ }2 B( D外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
    - B* ~: V" t) z) s# z- x2 U+ r7 p9 p2 E, }
    内循环试了4种方法,
    / B6 C/ E: i5 v3 C) N' l, R( v1. 直接调用 vector inner_product 247s 4 l0 p( ]2 u5 _' B5 ~% N( @
    2. vector 循环点乘累加 237s0 H2 A8 k( {" Q: N
    3. float * 循环点乘累加 204s
    $ i0 i: p  |6 W- h. B" m; f4. 空循环 100000 次 202s/ j9 |, q. `8 ?6 C: I( u

    ' u0 c0 R  C" @4 J不做内循环 200s3 ]$ \* p0 R8 L  y

    ( w' [; ]8 a: Y0 |" y; n你昨天说的对,内循环本身占比是很小的,大头在其他处理。
    ( P) a1 ~2 V9 W3 R, j" w+ Z另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
    2 ?8 y: r: I+ S$ |* z# U. ?
    + N. L9 B+ z' ^- s至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
    & K4 s, T' }. Q% k8 V' {
    1 v, N& @3 W! n7 T(为什么下面我贴的  b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成  jj 好了,原来 方括号里的 i 是斜体标志  LOL)
    ; }/ P$ g8 t0 x' }- L% N+ j7 J3 t' B+ a( K9 K& G7 ^! M
            std::vector < float > vec1(N);
    - v# S. g+ h9 Q8 O5 B        std::vector < float > vec2(N);6 {+ T& ?$ X8 w- H
            float* b1 = new float[N];# J% T; K, K( `/ H. m
            float* b2 = new float[N];
    & U! Z6 r0 N2 X9 n# J* m5 E3 w" v3 D' Y- k8 z3 x% s
            for (int j = 0; j < 6000; j++), }7 R: Y/ A2 I" U) O$ I  e
            {
    7 [; @  S, J. M; I                std::generate(vec1.begin(), vec1.end(), []() {/ @; }4 @: M' ^% S6 c5 V
                            return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;" Y, M  j$ t, n& T9 S
                            });3 Y, Z) _/ L' F! B% v  Q

    * V, z3 w! A7 h4 h4 R                std::generate(vec2.begin(), vec2.end(), []() {5 X  T5 Y8 I5 A4 \% t
                            return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;! |2 B8 y6 q3 e, O7 i' l
                            });
    ; w, X4 @' N) n* L. [$ x5 K! L. W. d$ z
                    for (size_t jj = 0; jj < vec1.size(); jj++)/ \5 @  k9 [# F8 b7 v! t3 l
                    {
    ( n2 z5 K, i/ y) h& U                        b1[jj] = vec1[jj];
    + J: r+ [7 f6 S, o- t1 R                }$ n% o, Q% \& n# @$ [. J( A% v. z
    2 _" g/ w/ L3 {3 m
                    for (size_t jj = 0; jj < vec2.size(); jj++)+ z' l0 r! x; e7 A+ D
                    {
      y6 M, Q; J+ Y5 _8 h+ V: m                        b2[jj] = vec2[jj];
    - m* p7 Q" @( M. Y; Y( I3 u" [                }4 u* |+ b8 {- D/ Y

    & k7 Q+ Y, z/ d6 |1 _* X' o5 \9 T                //Method - 1  N=100000 247s  : _) `5 Q) w4 s$ {4 w& Z1 `
                    //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
    1 u3 O% {- W0 O9 Q) j                                
    ' c2 z/ M$ U( v! g6 [: ^) v0 M                //Method - 2  N=100000  237s2 }* N$ {, f4 B: h1 M7 `$ i
                    /** ~6 q) N5 Y1 S# J8 y) n1 N* E& t& V
                    for (int jj = 0; jj < N ; jj++)
    ( O4 Z" k/ L- s6 A; A6 D! v1 i                {
    ' P* r: o, m. S0 n# O                        fresult += vec1[jj] * vec2[jj];
    5 X+ _$ w" z4 L  r# u: T% p/ Y/ E                }
    : Q* G+ Z, y* ^# i- k/ R; {                */
    6 Q7 v2 _7 y8 f4 r1 z                                : h4 l, F/ @' G1 ]3 v* e8 T  y
                    //Method - 3  N=100000 204s, n5 K' D( z9 S$ `# [$ T
                    /*
    0 @2 l0 V: b4 a2 i8 G                for (int jj = 0; jj < N; jj++)
    * |8 b. n- M) L$ f5 Z9 j                {$ F0 f9 g% Z$ f7 p% v
                            fresult += b1[jj] * b2[jj];
    4 f, M' U+ i9 y+ T5 [& d                }
    & T, a' @- a( S4 |) d. O                */0 F% M- b0 ?1 L. T
    1 e' q2 f2 D, p( e$ I
                    //Method - 4   202s7 x! B4 u# y* j1 s! f
                    /*  o" g4 Q1 J6 q8 w. {
                    for (int jj = 0; jj < N; jj++). ~. R* X/ |! Z  M2 W
                    {3 Q+ u/ b# T( b1 Q7 T. ]
                            
    & t" p0 O( L$ u' p                }
    2 Z* D, W& i+ ~- V# ~' `3 ?                */" h6 M/ M. @) [0 {, C) N8 F
                    //comment out all methods, N=100000  202s               
    ; @" k* ]8 ^1 y/ i8 `; o        }4 s+ i9 c6 |# l2 n. h8 r8 N
    ' a% _9 B6 q0 C
            delete []b1;! j6 \+ t+ X: e9 i4 ?8 ^0 I
            delete []b2;

    " l! \( v' a* Y2 J5 A( x; O
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    16#
    发表于 2022-9-27 00:15:38 | 只看该作者
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?
    2 }  ?* s- u5 N. S
    & X6 [7 J; ]0 V4 u你第二个试验里面的j在循环里面又重新定义了啊,你确定真的跑了6000次?
    4 w* Q, i# }. M  |
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    17#
     楼主| 发表于 2022-9-27 01:16:03 | 只看该作者
    机器猫 发表于 2022-9-27 00:15& t6 k8 |6 w/ x
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?  G( k0 l9 w" H% O
    ! q5 v# ^" c; ^: B3 N
    你第二个试验里面的j在循环里面又重新定义 ...
    $ \" i. {6 l$ y1 m1 l
    内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL3 y% L! l4 i2 f1 W9 y8 g! i
    & m3 v1 C% n9 I  V3 F& C  d; {' |
    不和它较劲了,瞎耽误工夫,我已经转到 ubuntu, 也准备顺便试试 avx2 向量化。
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    18#
    发表于 2022-9-27 02:06:58 | 只看该作者
    雷达 发表于 2022-9-27 01:16
    ; R. t5 w, @$ d8 n5 q* s2 V+ @内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL
    3 E% X4 t* a  H
    ' q/ B9 F0 `* r不和它 ...

    ! T9 F" a- A. x* F! g# [. u8 T" ~1 L6 _5 R; i
    不过可以试试我说的register变量。前一个试验j是混在一堆其它变量里一起定义的,很有可能是在stack上,这样内存读写会更多,要是再碰上每次都需要加载cache就更慢了。
    ) b3 Z7 n& \/ h5 ]4 a6 e后面一个是在循环那里定义的,说不定编译器就把它优化成register变量了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

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

    使用道具 举报

    该用户从未签到

    20#
    发表于 2022-9-27 20:29:50 | 只看该作者
    雷达 发表于 2022-9-24 23:54
    $ P7 ~  D4 F4 V+ S" X, ]/ V) Dvoid xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    ) h5 j( D( j) n# l0 U" ]' M{, k) Z9 G/ l- D8 \+ f+ r2 h
            comp temp, xtimesy;

    " ^4 |! T- H2 H% x这个code里面如果Openmp没有被注释掉的话,那么temp那个变量应该是定义在循环里面,否则线程之间会存在争夺写入那个temp的风险。/ p% I5 x2 c" O, q
    内层for循环如果没有内部操作的话,编译时应该被优化掉了,和你完全注册掉整个循环是一回事。可能你的编译设置没有打开优化?
      \: x1 `0 {* K4 U/ x1 CVS社区版没有问题,我工作用的就是社区版,设置正常的话不会比商业版差。以前游说头头用Intel Compiler,他说不想花钱,而且差不了多少,就一直用到现在。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2026-9-22 15:39 , Processed in 0.070348 second(s), 19 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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