设为首页收藏本站

爱吱声

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

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2022-9-24 22:54:26 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
    C++ 比 Octave 慢好多,怎么破?1 T4 p/ [* R# M4 ?

      ]3 ^% P0 ?8 z8 d: ^自相关两层循环,内层循环涉及浮点数计算,试验了一下把内层循环内部全都 comment out 只留个壳子,  但空的内层循环本身就把速度拉下来了,看来问题并不在浮点计算。
    : A. H1 U+ F: y( |3 O) a" V% P% f: f, Y1 E/ C& Y
    速度优化问题真的很有意思啊。% b( N0 @. J8 h. U) U8 v

    " h( _* K' Q) ~# q+ ~+ p& N欢迎大家继续讨论

    评分

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

    查看全部评分

  • TA的每日心情
    开心
    2025-12-26 03:23
  • 签到天数: 1954 天

    [LV.Master]无

    沙发
    发表于 2022-9-24 23:04:16 | 只看该作者
    拉下来?拉多少?
    : h- q* _' X, e! p2 q* z把代码贴上来看看?/ g( o4 }4 T; O0 m
    / Z( k. N2 `& h. _5 D$ o
    难道分支预测不准破坏流水线执行?不该啊。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    板凳
    发表于 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 编辑
    % _( f, h$ I. X  U+ x+ y7 H
    数值分析 发表于 2022-9-24 23:04) H5 _( {3 U5 b' F" Z: ~
    拉下来?拉多少?
    3 V. J- `6 s7 B把代码贴上来看看?
    8 t0 }; Z& c# J3 c: r
    7 h2 M* b& D. I" V6 v
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    3 U2 w8 X) v/ }' r& P. ^7 E. y" w{0 i& o6 M* l  y4 {4 D/ g1 E% p0 _$ D
            comp temp, xtimesy;& h$ l9 {! ]; Z. g0 l( y
            xtimesy.re = 0;, S( k2 v1 U1 f2 W& }& H, K
            xtimesy.im = 0;
    4 p$ e/ R& M  M7 N5 m1 t        int j0 = lenB - 1;8 t8 s+ x- w4 t) [* @& G
            int    i, j, i1, reali;
    / A% y# ?# T6 t# d        if (lenA % 2 == 1)2 u: {. e6 l, V) t7 k+ a
                    reali = lenA + 1;$ Q% k) C/ F& h
            else! i3 m1 o9 n4 ?: V  E! R4 r3 M
                    reali = lenA;
    . t1 W; V; z" Q$ `! M        reali /= 2;
    ) g& X5 ~. o/ p" X& \& U2 @: k* f8 l6 ^
    + k+ d2 P9 O$ T        int nconv = reali + lenB;
    ; a% ^# f( d! [2 w" x; u2 U        //#pragma omp parallel for
    2 y+ B0 N4 V1 R, B% K0 v        for (i = reali; i < nconv; i++)1 M+ ~4 H) w* ~7 B5 w5 Q
            {
    7 Q4 C  {1 O% u6 X. P0 d$ a                temp.re = 0;0 |( D# G: u* }, z
                    temp.im = 0;1 N- `1 U- L: m9 E# a9 a! T1 @
                    i1 = i;
    ! i" P4 r+ a; i                for (j = j0; j >= 0; j--)
    ' c  P# B( R" R                {" f3 e, q. k5 X, e
                            /* floating date operation */) L5 A0 I7 u/ M% d. e' d0 t" u2 S
                    }
    + \8 T& _6 k1 h- l
            }# J6 T) S7 ~3 s6 B# f7 \2 u
    }
    : Y' ?3 e4 k: P. k/ _5 A/ D* A. t: x) e
    xcorr函数代码如上,comp是复数struct, 做过长度为11、19两个矢量的测试,和octave结果完全一样5 K" V8 `- @0 v) v
    / a6 }3 y( ]. _1 Y) F
    红色部分是内循环,现在其内部操作都comment out 了, j0大概是 6000。
    7 ^. Z. |8 K9 q! G* j现在call xcorr 100次,耗时78s.
    % f  a5 ^; u4 l' I
    " G4 y' C: ]! o! _) X6 z如果把红色部分内循环本身完全comment out, call xcorr 1000次,耗时 <1s. # [9 ]: A( O6 ?

    - ]2 L% d: p  y& U6 v  V% W9 m
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    6#
     楼主| 发表于 2022-9-25 00:17:17 | 只看该作者
    风雨无阻 发表于 2022-9-24 23:33
    9 c) r+ V$ |  L: U0 r9 DMaybe Debug mode?

    ( c" P; o/ R1 l0 d- G+ a5 r
    + I7 d: I/ ^2 u) t不应该,看我上面的回复。
    2 O0 ~: L  Y, Z  D- m
    4 B+ l) s  F5 A2 t/ v# [% N我更怀疑是 VS 社区版的问题
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2025-12-26 03:23
  • 签到天数: 1954 天

    [LV.Master]无

    7#
    发表于 2022-9-25 00:20:10 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 00:24 编辑
      U) `. [0 k' i- X8 C1 j
    雷达 发表于 2022-9-24 23:54
    - C$ J: i2 s( L0 m/ }' T3 [void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    6 f& [* ?+ y$ l& i) c! q! N# D{
    / t8 `4 ^0 b! O1 ^        comp temp, xtimesy;
    : [# B7 ]( D$ J3 H( `6 }

    ; c1 _. y  g4 b# v5 L) Z# X; R这个不是这么比的吧。。。
    6 z) _9 O& Y2 F& X9 c7 C: E3 [& w" C: G  r& `5 d. J( z2 k7 f
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    $ S1 ]! y* S$ v$ y( t% w
    ) w4 ?/ L, ?- \  F; V; N7 k. w8 R而加上内循环,光jmp和dec指令就至少多执行了6000个,慢个几十倍不是正常的么?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    8#
     楼主| 发表于 2022-9-25 00:46:56 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 01:09 编辑 1 F4 g4 T7 Y) C# E- g
    数值分析 发表于 2022-9-25 00:20, V2 _, B' _5 X  _4 S5 @' t
    这个不是这么比的吧。。。# d- t3 V7 t4 _

    # F$ B8 @8 ^/ S您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    5 o  {6 v3 r1 S+ E/ o, V4 s
    5 ?1 ^3 X- w" f  `* ^* w6 I
    有道理。9 Q  O5 j9 g, e! n. e5 [6 \. ]
    所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,记得 numeric 库里有算向量内积的,我回头试试。% l9 {0 @& K* N6 z5 P0 G$ R3 [$ {6 G

    # i5 Q+ T+ V2 [0 O: p. E我先尝试尽量用标准库,一个小程序,不想搞得太复杂。多谢了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    9#
    发表于 2022-9-25 01:27:53 | 只看该作者
    雷达 发表于 2022-9-25 00:46
    5 b' [  s2 T8 a& W$ W有道理。0 _  C% u% V( Q
    所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,这大 ...
    ) Z: n- k0 Z+ k3 C: O
    你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子,把循环本身翻译成机器指令loop或dec/jnz,两者速度上会差很多
    , l" s5 E, n, w) y" ~/ OWhy is the loop instruction slow? Couldn't Intel have implemented it efficiently?
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    10#
    发表于 2022-9-25 01:48:51 | 只看该作者
    数值分析 发表于 2022-9-25 00:20
    7 p5 @* J5 l7 J9 I这个不是这么比的吧。。。
    . c- {, k: S- i  l4 d# W4 t# \0 `, {, ~- F8 S8 @& i* r8 ~! J
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    而加上内循环,光jmp和dec指令就至少多执行了6000个
    ) t8 w3 S! e) g8 t( l3 b! a

    " m0 {) j6 H" \( s( i& d# G现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果循环这样跑,花不了多少时间。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2025-12-26 03:23
  • 签到天数: 1954 天

    [LV.Master]无

    11#
    发表于 2022-9-25 02:06:44 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 02:16 编辑 * a* l' D9 \" n4 D7 W# C
    沉宝 发表于 2022-9-25 01:483 G4 U9 e$ K) ^. d  v
    现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果 ...

    , ?' I, q( B5 \7 m2 c3 B- ?. y1 `
    是的,兄台说的对。
    % \7 o$ d+ \2 l& {; F
    ( N6 G( p/ Z6 H8 F& j0 w其实我想说的是 真正数值计算部分和代码中其他不直接计算的overhead的比值这个事儿。
    ( M% ~7 M- _, Q( j& u0 }: P4 x
    + p% X6 S  ^. y+ b8 c雷达兄构造测试用例的时候,屏蔽掉了所有计算的部分,使得剩下的都是overhead,这样run time比较的结果就显得好像不合理了。如果把计算加回去,计算部分的run time会dominate,结果就不那么离谱了。因为不好说,所以用指令数对比的方式试图直观地说明这一点。! h9 N% L' s7 {) o# v
    : I, T7 g6 Z) M- p) m% {' M
    比如说,如果有计算,那么跑六千个循环相对于计算应该用不了多少时间。但是如果一边是什么都不做,另一边是六千个循环,那六千个循环比什么都不做慢几十倍了,就不是那么不合理了。* w" ?/ V  Y+ E! n# w# Q

    & z7 y3 R" j* v; ?4 E. F  j# v当然也有可能像兄台说的,是优化参数的问题,但我觉得更多地是测试用例设计的不合理。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    12#
     楼主| 发表于 2022-9-25 04:47:43 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 04:49 编辑
    8 ]4 r& T/ @; v) h6 j5 R
    沉宝 发表于 2022-9-25 01:277 k3 |1 y$ |7 [# d) {4 b
    你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子 ...
    3 _5 {. j9 P" A) C: w* o  t0 `

    ( P. [6 Z" i2 ?; B1 z, F1 r8 Y又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差一倍,我上面这个差的太多了。
    - @! S8 I6 o1 W: E: l
    7 g9 D- x& R, ~$ ~2 n我已经完全懵了。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    13#
    发表于 2022-9-25 05:51:23 | 只看该作者
    雷达 发表于 2022-9-25 04:47
    / ]* L1 H* L! J8 M  a又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...
    $ e" _7 {) Y# ^3 l
    时间差一倍的结果可以接受。( v$ w! t3 Q+ _
    % v1 n3 j" K. @/ F9 \: J. s
    你还是用profile工具看看吧。现在大家都主观瞎猜。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2025-12-26 03:23
  • 签到天数: 1954 天

    [LV.Master]无

    14#
    发表于 2022-9-25 14:58:59 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 15:38 编辑
    8 R* t$ Y& ~2 @$ f
    雷达 发表于 2022-9-25 04:47! o1 E$ Z( v9 d9 z
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...
    * o% d) V  o: ^" v

    , F0 {+ s3 e; o2 W
    ! m: d  H1 m0 T" A5 X
    + Q. D0 `: G, c3 c  n, u能不能把这个也贴上来,看看和上一个有什么不同?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    15#
     楼主| 发表于 2022-9-26 01:30:03 | 只看该作者
    本帖最后由 雷达 于 2022-9-27 01:17 编辑
    + H- E3 F% Z, a: C. S
    数值分析 发表于 2022-9-25 14:58
    0 g/ q. p/ L0 N5 u8 ?6 U% a1 {5 e能不能把这个也贴上来,看看和上一个有什么不同?
    , p: I/ Q: R* O
    理了理思路,重新做了一个测试。
    * R/ m6 G) [' h: N5 R; O做了两个 vector 和 两个 float *, 都长 100000
      j6 d) `. s& Q6 M6 g! w- P& y外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.& x: q* c" i) u. ~* o4 @

    ! z' a2 `& A) l/ \5 t- N) R内循环试了4种方法,6 x! o5 S' g3 m% `: o
    1. 直接调用 vector inner_product 247s
    % Q1 ?! W6 N; r. g3 F2. vector 循环点乘累加 237s
    - ]' j3 P5 Y3 O  h5 {3 w) B3. float * 循环点乘累加 204s. D1 r4 X/ L7 D. O4 B
    4. 空循环 100000 次 202s
    ; M- B  I" X/ R' X- l& t% G2 n2 z. T0 W0 r( j+ G/ ]2 a
    不做内循环 200s
    + |, J# k$ ~5 S# _0 U8 S  F$ e6 ^% Q' o) a( n# j( c
    你昨天说的对,内循环本身占比是很小的,大头在其他处理。
    ( e1 R/ x0 b2 @3 H/ O另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。+ h0 H) ]% `8 q1 f
    ; f( k8 u' t+ h9 V/ c$ Y
    至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)/ `0 G, M2 L8 t5 M) Z
    , x( Q' }1 {7 c" w
    (为什么下面我贴的  b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成  jj 好了,原来 方括号里的 i 是斜体标志  LOL)
    * f. `% @% B8 c4 @- R- c
    * t: b0 S/ y+ f" m7 x
            std::vector < float > vec1(N);
    + j6 z2 X6 N$ w        std::vector < float > vec2(N);# y5 \& k, @. Y/ Q- K
            float* b1 = new float[N];" P: k$ A0 N* c/ a: n
            float* b2 = new float[N];
    / m: X$ z8 g" q( g4 J
    5 Z- ]. D4 l# N. M, C        for (int j = 0; j < 6000; j++)
    1 M' @0 i% z& [        {
    * O, P- A0 a' S+ ?# U+ g. ~% V                std::generate(vec1.begin(), vec1.end(), []() {
    5 P7 y9 Z7 \' R1 h- E                        return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;. p) u+ ~; ?2 y$ v2 a1 b6 N  |* E
                            });4 Z/ ]2 p1 z# i' ~* \

    2 y* M0 _  @! _                std::generate(vec2.begin(), vec2.end(), []() {
    $ Y# e% R/ D4 [- A0 Q% D                        return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
    . t+ f8 ]( ]; V! }0 H7 [1 `                        });
    ( K. D/ s& R9 z) B  Z# K1 f! \/ F) n- `/ w
                    for (size_t jj = 0; jj < vec1.size(); jj++)
    . G1 M" ^& t6 p( P" ]                {5 ~" ^" T/ D: n5 r  ~
                            b1[jj] = vec1[jj];% _0 A/ g$ p' y- T! S' Z' @; F
                    }
    " ~7 J: K  O, u+ Z$ M) \9 V( o7 C4 A2 u% e: s
                    for (size_t jj = 0; jj < vec2.size(); jj++)4 y7 u' G7 `- o  o0 K2 \( F
                    {& j. S! s- u+ _1 Z7 }. n/ X2 L) C
                            b2[jj] = vec2[jj];
    2 C) Z! Q: r4 Q3 ?/ {                }* W$ K; z+ N5 E, |, T: a( S
    . @- y4 Y) \# @
                    //Method - 1  N=100000 247s  ( ?' d1 f) q+ Z+ p- K8 x: B& Q
                    //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);9 Y$ B( k* }8 T9 g
                                    
    $ O5 ?' w+ g, F0 h5 l! [; `/ T3 R                //Method - 2  N=100000  237s5 G4 H7 ?6 O. `. ]! f, I) w; N6 Y
                    /*. h$ A2 q9 }8 p5 g! k, e
                    for (int jj = 0; jj < N ; jj++)7 u( s7 f* o1 X9 i8 B* e# E
                    {( B, ~" w) e5 k$ `
                            fresult += vec1[jj] * vec2[jj];
    8 k$ r" N3 t# k+ c                }$ u% I" H7 o, R* f5 H, [. d+ R
                    */
    3 G% c# R- I, y0 A0 L* S, T                                
    + [  J& t8 s  d2 z& U                //Method - 3  N=100000 204s
    . e7 ^$ K& c) |5 N: x1 {                /*
    4 h0 @$ P9 ]/ l2 D5 k' j* F                for (int jj = 0; jj < N; jj++)
    " j3 f- }3 S1 r) x& {( C0 ^2 |7 E3 T                {( ?1 `3 z, [0 T% q
                            fresult += b1[jj] * b2[jj];
    : Q( Z; |. i1 P* U1 K0 a1 ]9 c                }+ v7 ~' L6 g: w) ~8 @* l
                    */) B( l9 P+ k/ D, `7 q1 k" L3 j' a

    ! V1 q4 b3 ^. P7 W. d- X- E" e. D                //Method - 4   202s
    & |* [0 B* h5 c/ t/ n- q6 x                /*
    ; \+ P1 y$ z3 G: A0 H1 [                for (int jj = 0; jj < N; jj++)
    1 F3 m7 f, x' `                {" ?# _) O$ l. r; L9 }* j
                            
    2 C% U, e  N2 R                }# `1 J. [& f# S7 B9 V, ~
                    */
    1 v$ p  a: M5 @                //comment out all methods, N=100000  202s                ! P/ o; @: U% [( U+ S
            }
    * n! p- L( ]5 |+ x! F  j
    8 E- P: ]5 p( E7 o. t2 u' J. ^3 \        delete []b1;$ z6 |6 Y  t& |. w! ?6 i
            delete []b2;
    9 N: `& h& f+ `5 \6 s
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    16#
    发表于 2022-9-27 00:15:38 | 只看该作者
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?
      I9 h" e: _8 Y  f+ b7 H. A2 t
    / s$ _) l% V$ @- c, y你第二个试验里面的j在循环里面又重新定义了啊,你确定真的跑了6000次?
    6 g  g* m" ~" a! r
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    17#
     楼主| 发表于 2022-9-27 01:16:03 | 只看该作者
    机器猫 发表于 2022-9-27 00:15
    : \/ f* V$ n) ?$ g9 I( }1 n瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?
    8 l/ P* C* F& b3 y# e4 G0 a% p: l! ~4 Q' S
    你第二个试验里面的j在循环里面又重新定义 ...
    4 c3 q  w6 f+ N% E& M. @& p
    内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL) y3 L& u2 H2 T. t+ l
    ) Q; }! w# W2 q) y6 r7 F4 T
    不和它较劲了,瞎耽误工夫,我已经转到 ubuntu, 也准备顺便试试 avx2 向量化。
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    18#
    发表于 2022-9-27 02:06:58 | 只看该作者
    雷达 发表于 2022-9-27 01:16
    2 f) Z$ X1 B* k- n# i2 x内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL( l* z2 g; i  b+ y7 _
    # ?% A  l, ~( x1 g9 R$ w
    不和它 ...

    5 @1 v2 H* u* f7 ?. F% S, m
    # g7 u% [: C3 m9 \+ _不过可以试试我说的register变量。前一个试验j是混在一堆其它变量里一起定义的,很有可能是在stack上,这样内存读写会更多,要是再碰上每次都需要加载cache就更慢了。$ ^: `  u; I% |4 I* A; a5 O: f" x  V
    后面一个是在循环那里定义的,说不定编译器就把它优化成register变量了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

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

    使用道具 举报

    该用户从未签到

    20#
    发表于 2022-9-27 20:29:50 | 只看该作者
    雷达 发表于 2022-9-24 23:54& w/ G9 M  N1 G
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)' A# T8 q" v3 ~% m/ ?6 j
    {
    7 u  F1 q4 z6 K4 ]) o8 M; t% t        comp temp, xtimesy;

    " p. T3 }0 k3 o' k! {. Z这个code里面如果Openmp没有被注释掉的话,那么temp那个变量应该是定义在循环里面,否则线程之间会存在争夺写入那个temp的风险。3 ?+ v# ?; ]1 G
    内层for循环如果没有内部操作的话,编译时应该被优化掉了,和你完全注册掉整个循环是一回事。可能你的编译设置没有打开优化?
    7 ]: p$ @  ~$ E  n0 s( I" wVS社区版没有问题,我工作用的就是社区版,设置正常的话不会比商业版差。以前游说头头用Intel Compiler,他说不想花钱,而且差不了多少,就一直用到现在。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2026-1-5 10:17 , Processed in 0.063608 second(s), 18 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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