设为首页收藏本站

爱吱声

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

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

[复制链接]
  • TA的每日心情
    擦汗
    2024-12-25 23:22
  • 签到天数: 1182 天

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2022-9-24 22:54:26 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
    C++ 比 Octave 慢好多,怎么破?
    0 q( k: U3 R6 q- q$ R7 c  F* E* d5 k. W; d+ E& _: z
    自相关两层循环,内层循环涉及浮点数计算,试验了一下把内层循环内部全都 comment out 只留个壳子,  但空的内层循环本身就把速度拉下来了,看来问题并不在浮点计算。, B/ j. K' E: D+ j) _+ X, p

    ' i) ], ?1 y5 w7 h( D速度优化问题真的很有意思啊。! d) ?- [; y$ s3 F/ k' O
    / [! U9 }; h+ i' U* B
    欢迎大家继续讨论

    评分

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

    查看全部评分

  • TA的每日心情
    开心
    7 小时前
  • 签到天数: 1884 天

    [LV.Master]无

    沙发
    发表于 2022-9-24 23:04:16 | 只看该作者
    拉下来?拉多少?
    * F/ t! F8 `) R把代码贴上来看看?
    " Y: s. w' [& C% g+ f% @9 v  [9 v8 X8 l/ T" F, a" |  _6 x* i
    难道分支预测不准破坏流水线执行?不该啊。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    板凳
    发表于 2022-9-24 23:15:41 | 只看该作者
    会不会代码本身的缺陷阻止了自动优化?另外,硬件配置和开发环境可能也有关系。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2024-4-22 03:36
  • 签到天数: 120 天

    [LV.7]分神

    地板
    发表于 2022-9-24 23:33:02 | 只看该作者
    Maybe Debug mode?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    擦汗
    2024-12-25 23:22
  • 签到天数: 1182 天

    [LV.10]大乘

    5#
     楼主| 发表于 2022-9-24 23:54:10 | 只看该作者
    本帖最后由 雷达 于 2022-9-24 23:57 编辑 7 I7 n6 {7 P1 X
    数值分析 发表于 2022-9-24 23:04+ B! ?6 Q* r+ n5 Z9 N
    拉下来?拉多少?
    7 R9 ^* @" b! i# t' _/ f0 O6 O( i把代码贴上来看看?
    8 p! p7 D/ |8 j4 ~: V* E
    / ]  {5 n6 c/ Z" d. p2 }. t4 G4 Z6 d
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)5 |9 J/ x$ V1 [: M4 l  A
    {
    6 t1 z, j& C/ F9 r5 _" x: a! C        comp temp, xtimesy;0 [5 L& N. g0 W  P6 B2 q  b
            xtimesy.re = 0;8 F8 s6 v- y% _0 ^) x# W
            xtimesy.im = 0;+ R$ o9 p" ]3 M0 L0 \
            int j0 = lenB - 1;
    " l, w% g% T: ^" }9 s4 N. b        int    i, j, i1, reali;' Z% s9 \/ m% m/ }+ s5 h
            if (lenA % 2 == 1)! l6 |1 R, g! M3 T% S
                    reali = lenA + 1;
    , h) d- @; o: R+ V        else
    + B, A6 j9 r- {: Y9 y- p                reali = lenA;
    - }3 T2 n! E6 N2 |3 }9 K        reali /= 2;
    ( R5 c! G6 C5 E4 Q7 D( n/ A2 h
            int nconv = reali + lenB;
    " O& S: @/ Q. D' {        //#pragma omp parallel for
    " J. X+ I+ x$ l& v$ S8 X        for (i = reali; i < nconv; i++)
    9 N# ^' c$ `' `( _. `9 S' V        {# Y9 A! D. g6 ^; t9 i' Z# O# s& B
                    temp.re = 0;, T# B1 p1 H) X; ^6 R( a7 s
                    temp.im = 0;: V. t; h% M; G9 _; H: V# d
                    i1 = i;
    9 V/ a$ w! y+ `) {! |                for (j = j0; j >= 0; j--)% a7 D, ]3 D. u0 {1 p
                    {- P1 o0 `* ]3 A* _
                            /* floating date operation */9 I8 d" w! P5 t/ _" W3 d) L
                    }

    2 Z: w2 L  m8 B        }
    ; g' W3 A$ E* W3 I+ X}
    , o6 c6 o' U6 o8 j1 ~# B, L6 O' @9 b5 m2 R
    xcorr函数代码如上,comp是复数struct, 做过长度为11、19两个矢量的测试,和octave结果完全一样
      G% r- x2 l9 c. f, y; [1 O2 K9 W; H
    红色部分是内循环,现在其内部操作都comment out 了, j0大概是 6000。; r. R! z+ r8 z" \, A- T
    现在call xcorr 100次,耗时78s.) ~& g# E( g" J! l$ _4 j

    " R: V4 `5 J4 a- C, {6 h8 k& [4 ~如果把红色部分内循环本身完全comment out, call xcorr 1000次,耗时 <1s.
    2 W; X4 G5 e( K/ B! S' b! C# g" n- Q( D. L- {" [
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    擦汗
    2024-12-25 23:22
  • 签到天数: 1182 天

    [LV.10]大乘

    6#
     楼主| 发表于 2022-9-25 00:17:17 | 只看该作者
    风雨无阻 发表于 2022-9-24 23:33& b& q6 K8 x2 i- o2 \
    Maybe Debug mode?
    ' P" v$ P& x) w' w  k- U. ^
    1 R8 x1 X3 c1 W: k- m* A
    不应该,看我上面的回复。& `! m% _8 E5 w0 A

    + C0 z; \. b8 z1 o. o+ t/ H我更怀疑是 VS 社区版的问题
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    7 小时前
  • 签到天数: 1884 天

    [LV.Master]无

    7#
    发表于 2022-9-25 00:20:10 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 00:24 编辑 # U. a  ]! i/ i4 I0 X5 Z' v
    雷达 发表于 2022-9-24 23:54- N- f/ s/ [. K5 v' M7 A. j
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)1 d5 {* r' i# t% J: R
    {0 T: z# E2 @. a# K
            comp temp, xtimesy;

    2 f, [& Y! D0 v; l+ e0 ^9 X# H. q- K& [2 D/ \; s+ M
    这个不是这么比的吧。。。8 B- C6 j" y2 E
    # Y: ~$ O& x) q! l- R
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    4 s, Z. c' ~1 z
    8 e( @* f, A& |" N" f; Z而加上内循环,光jmp和dec指令就至少多执行了6000个,慢个几十倍不是正常的么?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    擦汗
    2024-12-25 23:22
  • 签到天数: 1182 天

    [LV.10]大乘

    8#
     楼主| 发表于 2022-9-25 00:46:56 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 01:09 编辑 8 Y. I6 ?2 W5 n, j: w
    数值分析 发表于 2022-9-25 00:20& a9 t. w& x: c
    这个不是这么比的吧。。。
    % R$ X0 g/ O: o( D" S- K! ], X: e6 W! d+ H7 |. ~# {
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    8 R' C- U/ t" u  Z! O3 A7 }

    7 }0 g) s0 ^; \! A2 v( k8 }. s6 H有道理。
    ( Q/ [0 L5 K* i1 e0 ]! N7 [所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,记得 numeric 库里有算向量内积的,我回头试试。( V. I7 [$ B# l+ Y& P6 V

    + S4 e! Z* Q# e) S7 x  m我先尝试尽量用标准库,一个小程序,不想搞得太复杂。多谢了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    9#
    发表于 2022-9-25 01:27:53 | 只看该作者
    雷达 发表于 2022-9-25 00:46
    " r6 }' X3 R. N1 \# l有道理。
    8 r& o3 }( v' t6 M/ c# d所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,这大 ...
    ) m+ J5 i0 E( }! x( `7 O
    你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子,把循环本身翻译成机器指令loop或dec/jnz,两者速度上会差很多3 B  i, T) j7 ?; E
    Why is the loop instruction slow? Couldn't Intel have implemented it efficiently?
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    10#
    发表于 2022-9-25 01:48:51 | 只看该作者
    数值分析 发表于 2022-9-25 00:203 S: o  Y) S9 w6 Y- f3 X( a. n
    这个不是这么比的吧。。。* g7 S  I- [9 {8 C* Q

    - `+ ?8 T6 \1 l( x您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    而加上内循环,光jmp和dec指令就至少多执行了6000个
    2 D8 f- \6 S5 N1 Y5 k) `

    ' d! \$ e$ ]2 }6 h, _" C现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果循环这样跑,花不了多少时间。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    7 小时前
  • 签到天数: 1884 天

    [LV.Master]无

    11#
    发表于 2022-9-25 02:06:44 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 02:16 编辑 : m( S& ?' O. P) l) \+ r
    沉宝 发表于 2022-9-25 01:48
    1 b  p4 v. Z# M5 o' ^9 i4 v现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果 ...
    3 s; E% T9 x8 P; u4 p

    ) S: u( r5 I$ w" q是的,兄台说的对。! s+ X: u0 G& h4 }4 T

    . [' S. N* _% s其实我想说的是 真正数值计算部分和代码中其他不直接计算的overhead的比值这个事儿。
    - Y5 _' D! Q$ {' x" f* W% B- Q. v: U' c
    雷达兄构造测试用例的时候,屏蔽掉了所有计算的部分,使得剩下的都是overhead,这样run time比较的结果就显得好像不合理了。如果把计算加回去,计算部分的run time会dominate,结果就不那么离谱了。因为不好说,所以用指令数对比的方式试图直观地说明这一点。! k6 j8 o; B( @% c, y+ O9 G

    $ j9 L# _1 {# }% D( G0 Q比如说,如果有计算,那么跑六千个循环相对于计算应该用不了多少时间。但是如果一边是什么都不做,另一边是六千个循环,那六千个循环比什么都不做慢几十倍了,就不是那么不合理了。" S# U8 N. f4 g+ O: C0 a/ d
    ; N3 x: e) U9 q! z( B9 V/ R
    当然也有可能像兄台说的,是优化参数的问题,但我觉得更多地是测试用例设计的不合理。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    擦汗
    2024-12-25 23:22
  • 签到天数: 1182 天

    [LV.10]大乘

    12#
     楼主| 发表于 2022-9-25 04:47:43 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 04:49 编辑
    4 B5 l, p, E* H% I: S2 v7 ]3 C2 ]
    沉宝 发表于 2022-9-25 01:27& X: L9 i5 d5 ]. [
    你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子 ...

    , j- d$ i0 f$ M; ]5 e/ F7 c6 M! l  [  }& w
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差一倍,我上面这个差的太多了。, p' H/ Q. W$ N9 t* |

    ; Q/ q- n% N% E* \. h% r我已经完全懵了。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    13#
    发表于 2022-9-25 05:51:23 | 只看该作者
    雷达 发表于 2022-9-25 04:47( U/ ^8 ]' C0 C; k# H/ |2 o( e2 k+ k$ L
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...
    % w( v6 L$ _; d7 U; W
    时间差一倍的结果可以接受。
    / U2 _) [# c1 H/ c, l/ ?- D- W% f2 n/ \8 a
    你还是用profile工具看看吧。现在大家都主观瞎猜。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    7 小时前
  • 签到天数: 1884 天

    [LV.Master]无

    14#
    发表于 2022-9-25 14:58:59 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 15:38 编辑 1 D& ?! `6 d5 X. F9 Y
    雷达 发表于 2022-9-25 04:476 E/ _; V0 r' G+ E- s% I! o
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...

    , t" H6 [  v: X! E- r+ n5 a, F
      g, }, a( H4 [2 o8 v% t0 |# S. n6 I- S1 Q
    % a. v, O* H3 M$ M2 C  z3 f$ I
    能不能把这个也贴上来,看看和上一个有什么不同?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    擦汗
    2024-12-25 23:22
  • 签到天数: 1182 天

    [LV.10]大乘

    15#
     楼主| 发表于 2022-9-26 01:30:03 | 只看该作者
    本帖最后由 雷达 于 2022-9-27 01:17 编辑
    % H: F- d2 H( T/ V: A; f
    数值分析 发表于 2022-9-25 14:589 G) b9 R2 j7 E
    能不能把这个也贴上来,看看和上一个有什么不同?
    $ W) |" F. f% L! Q/ w  r2 a- S
    理了理思路,重新做了一个测试。
      p  \# W2 [' V# k/ g2 E6 Y- g做了两个 vector 和 两个 float *, 都长 1000003 _; q0 H5 m  B' O8 w" v  f
    外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.2 L- R8 W  ?5 p+ J4 A, Y5 w( p- ^% a
    + A. _# }# O" K" O: Q* S; x
    内循环试了4种方法,( G5 q. S! _1 m" A. d/ Z
    1. 直接调用 vector inner_product 247s : b+ }9 @- G8 L# y; ]
    2. vector 循环点乘累加 237s
    7 @' y) p+ L1 U3. float * 循环点乘累加 204s
    ; x6 i- y" Y. H; x) ~4. 空循环 100000 次 202s
    " h9 w4 R% N* i! p5 U  I- M1 o' Y' g) `6 e+ n: M9 K
    不做内循环 200s
    5 U* c2 B1 I9 c9 y1 {8 m( W4 z& ^2 A" x' [4 k# M. @# P) O$ w
    你昨天说的对,内循环本身占比是很小的,大头在其他处理。
    8 j8 x! t4 \8 O另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。, t( f0 h7 z! {) @( a

    4 y4 \' {8 _. v7 _* Z至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
    - b5 l0 t1 z( X# o, H  r- b( x! }5 K3 S- Q1 L
    (为什么下面我贴的  b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成  jj 好了,原来 方括号里的 i 是斜体标志  LOL)- f. O7 C, A$ W# U3 R
    & o# q7 Q9 J0 V: L" Q
            std::vector < float > vec1(N);
    8 d4 \- o  K8 `2 C8 ?$ ^5 K! Q        std::vector < float > vec2(N);
    ; p6 D1 k5 ?" P8 U- n        float* b1 = new float[N];
    " H' l( E5 U+ E$ v        float* b2 = new float[N];5 o/ R! y7 o" s2 ]. G5 Q

    # ]+ C* u( w9 N, `' t3 {        for (int j = 0; j < 6000; j++)
    0 e) `* h- _8 v$ O! \6 x- S        {
    5 Y" Z2 P$ H% d+ G) U' N                std::generate(vec1.begin(), vec1.end(), []() {1 l* x) R3 U( g+ V
                            return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
    + d. f) |* l% H7 f1 H                        });
    ! T5 H, @0 C  E
    ) a% u7 E$ E1 X9 @                std::generate(vec2.begin(), vec2.end(), []() {1 Z: e! i$ Y  a' h
                            return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
    9 @& ?" a) m# {                        });" d0 L8 A& N/ ~" J9 u; i  Z

    6 C! ~$ p) j( s7 h2 S. |) T" j& A& S                for (size_t jj = 0; jj < vec1.size(); jj++)  H$ H1 f9 }9 m; _& [
                    {- M6 H8 W/ O5 b8 F1 B" b1 y
                            b1[jj] = vec1[jj];
      y3 w* ?+ ^/ ]+ a" V. @& ^                }
    - z2 Y5 f8 ]+ }. v  u' _& i$ M% j
    . o9 k% R4 C- @2 ?( o                for (size_t jj = 0; jj < vec2.size(); jj++)
    / M4 v: X8 F9 v$ H                {
    $ m* \) V' Y) y6 O7 C                        b2[jj] = vec2[jj];* q: R3 R, q0 s8 \+ Y
                    }/ H6 R& a; A" B$ U

    ) r7 Q- k" s: B" {, I5 X) k0 |                //Method - 1  N=100000 247s  8 ?" V7 d) }+ _3 ~2 u# z
                    //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
    / r5 M3 Y  W) |  t- y+ Q- y0 v: K                                
    # @: X: M7 G! w' d                //Method - 2  N=100000  237s
    + `, E+ V( |1 ^/ d- s; |1 |                /*
    ; G+ u$ |" O7 A2 f7 O$ B3 C# v9 @                for (int jj = 0; jj < N ; jj++)
    / M2 s' ^$ t9 q* n/ o5 q                {
    4 T  G( N4 @' V7 `                        fresult += vec1[jj] * vec2[jj];# E; Q+ S2 y. E' L
                    }
    $ B% y' v4 i* O) W1 X6 U0 ]! e                */. ]. s3 J% p: d7 w8 v( W
                                    
    $ h; [9 @/ B; B3 M# _; k                //Method - 3  N=100000 204s4 W& s8 p4 @, A8 \  [: c  N
                    /*$ P7 x; U# U* ]/ m/ o: y1 B
                    for (int jj = 0; jj < N; jj++)( T0 B4 Y0 J$ |2 a
                    {2 `$ l8 l1 [& S( x$ |4 G& ~  t7 W
                            fresult += b1[jj] * b2[jj];8 L- |3 I6 {, Z
                    }$ W6 u" N) M3 p- X' j! S; O
                    */
    ) A& T& L. H) v; X; @; o, Q. g( S5 X  p! G
                    //Method - 4   202s, [- A! _" x+ r% f# t
                    /*
    & {- ^# f- g  w/ m4 R9 J$ ^! G                for (int jj = 0; jj < N; jj++)5 s8 T0 D+ x4 F  ^: C' e4 N
                    {
    $ }7 ^+ A! \3 f                        2 L' e# f4 u7 C; {& k1 p
                    }6 Z9 B: D) s5 G) X
                    */
    0 H9 O4 N6 s" h* Z% _                //comment out all methods, N=100000  202s               
    ) Y4 ~) k. g- l/ o        }* f" h  i: O% Q! C+ W+ N
    ) K* m4 ^- Y, @' T3 F! K7 B8 j7 E
            delete []b1;/ v, _9 n6 \, w) N0 l5 B: G9 f
            delete []b2;

    ) ~- h! r+ a, B1 m% n% u, R: q
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    16#
    发表于 2022-9-27 00:15:38 | 只看该作者
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?" o" o& R  d/ O5 }  k% B  r& }& i

    2 Q! t# j; ~: R+ P+ ^4 |你第二个试验里面的j在循环里面又重新定义了啊,你确定真的跑了6000次?
    6 e" S( R9 G1 d3 L
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    擦汗
    2024-12-25 23:22
  • 签到天数: 1182 天

    [LV.10]大乘

    17#
     楼主| 发表于 2022-9-27 01:16:03 | 只看该作者
    机器猫 发表于 2022-9-27 00:15( Q/ k$ |* D; s( c
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?8 u, W2 y0 }' n8 `. I9 Y. e

    ) I4 ^  P% h4 d! ?" |2 \你第二个试验里面的j在循环里面又重新定义 ...

    - K; B( x, f2 f7 z内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL
    # ]7 a% N; d9 p7 x, h- B& ?1 m, [0 ~& m: d
    不和它较劲了,瞎耽误工夫,我已经转到 ubuntu, 也准备顺便试试 avx2 向量化。
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    18#
    发表于 2022-9-27 02:06:58 | 只看该作者
    雷达 发表于 2022-9-27 01:16
    / }- g3 e1 V$ Z& _8 a; c4 G4 h6 o内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL3 b1 H3 A$ \# I; m
    9 f5 Z  N# \/ {1 z3 `
    不和它 ...

    # O- N0 M- Q  B3 Z6 A
    * q, P2 m- J& y0 Q不过可以试试我说的register变量。前一个试验j是混在一堆其它变量里一起定义的,很有可能是在stack上,这样内存读写会更多,要是再碰上每次都需要加载cache就更慢了。. j7 M7 R  m- J3 V" o4 V5 \- f
    后面一个是在循环那里定义的,说不定编译器就把它优化成register变量了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

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

    使用道具 举报

    该用户从未签到

    20#
    发表于 2022-9-27 20:29:50 | 只看该作者
    雷达 发表于 2022-9-24 23:54& r. R% e6 m/ R+ Q0 q
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    " r: _, L) G& y2 l+ a2 f) E{0 R: C8 v) U5 V$ b
            comp temp, xtimesy;
    7 k! Y' x/ X$ M0 w! k
    这个code里面如果Openmp没有被注释掉的话,那么temp那个变量应该是定义在循环里面,否则线程之间会存在争夺写入那个temp的风险。* a% M$ e9 Y3 x/ N( c, d- E$ s3 ]
    内层for循环如果没有内部操作的话,编译时应该被优化掉了,和你完全注册掉整个循环是一回事。可能你的编译设置没有打开优化?
    0 O6 k5 v" E7 u' b: GVS社区版没有问题,我工作用的就是社区版,设置正常的话不会比商业版差。以前游说头头用Intel Compiler,他说不想花钱,而且差不了多少,就一直用到现在。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2025-5-11 08:34 , Processed in 0.046127 second(s), 19 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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