设为首页收藏本站

爱吱声

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

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

[复制链接]
  • TA的每日心情
    擦汗
    2024-9-2 21:30
  • 签到天数: 1181 天

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2022-9-24 22:54:26 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
    C++ 比 Octave 慢好多,怎么破?
    4 k. K" c& z/ ^. R- u
    0 _5 M7 I! o+ m' X/ O自相关两层循环,内层循环涉及浮点数计算,试验了一下把内层循环内部全都 comment out 只留个壳子,  但空的内层循环本身就把速度拉下来了,看来问题并不在浮点计算。: [" }: @0 |) [' f) @6 x; v% K
    7 e+ I6 g& d$ T% h5 q* G2 y9 E4 A
    速度优化问题真的很有意思啊。
    1 ?' ^0 d' l5 ^- c  e) W# M9 z& T' d9 P2 `3 M
    欢迎大家继续讨论

    评分

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

    查看全部评分

  • TA的每日心情
    开心
    昨天 00:26
  • 签到天数: 1733 天

    [LV.Master]无

    沙发
    发表于 2022-9-24 23:04:16 | 只看该作者
    拉下来?拉多少?
    " s+ ]$ X! j. S把代码贴上来看看?
    ) D( \% E( S, s' Q
    * g/ a( i( G  d; q$ [难道分支预测不准破坏流水线执行?不该啊。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    板凳
    发表于 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-9-2 21:30
  • 签到天数: 1181 天

    [LV.10]大乘

    5#
     楼主| 发表于 2022-9-24 23:54:10 | 只看该作者
    本帖最后由 雷达 于 2022-9-24 23:57 编辑
    6 n8 i8 Z& y) Z" T9 s' l" I+ e
    数值分析 发表于 2022-9-24 23:04# d: h# x8 i8 w( Q% a
    拉下来?拉多少?
    , M3 w. F+ h$ j# B把代码贴上来看看?
    : [' m1 K/ ^; J

    ) J" _& T! E+ p+ z1 _void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    " v5 o- X+ I# i* v{2 A) A4 O5 C) c; b, a% @" {4 x3 z
            comp temp, xtimesy;! A+ n& c0 w. r: I: e! X0 s
            xtimesy.re = 0;
    4 v% Z* d+ R1 i        xtimesy.im = 0;
    9 D$ n0 ]% F' o- J        int j0 = lenB - 1;
    3 H( _  c5 C2 d  h6 c        int    i, j, i1, reali;* }/ [$ U; {1 D8 ~( G8 q5 a8 s+ S
            if (lenA % 2 == 1)
    2 M  R- W# _; o+ K$ J% r# T$ _                reali = lenA + 1;
      Z- ~1 }; s' t7 w  M' c2 }8 o        else/ g, Z! Q6 z' ~! K
                    reali = lenA;1 g* W. w: w9 V! b/ k+ U" V
            reali /= 2;+ T1 L1 l3 v4 |: m5 R& [) S* v

    * T# _/ J, q; E* v0 [- B/ I( V        int nconv = reali + lenB;# {) K/ t, G: }
            //#pragma omp parallel for
    2 y, N% @6 V" x# [8 p8 P  f! q% b        for (i = reali; i < nconv; i++)
    + w3 r6 P. a3 x        {9 h. _0 \4 H* c5 I
                    temp.re = 0;( w$ G" S/ a0 i( ^( A* _: D
                    temp.im = 0;/ i1 ^. M. |2 _+ j- M/ z3 B
                    i1 = i;) r- M: o* Z: r9 }( M  }0 ?; k
                    for (j = j0; j >= 0; j--): a2 q+ X% t/ |, Z! @
                    {
    $ ~) c# [; j1 P( `- Y  i                        /* floating date operation */$ G/ y$ z9 J$ y  J
                    }

    - I8 A1 J% R$ e. B        }
    ; A4 q% C/ \) H9 c}
    ) V/ s$ p& U) S# w( o$ V5 c& V1 q% j' m9 j* r' H( ?1 M- p
    xcorr函数代码如上,comp是复数struct, 做过长度为11、19两个矢量的测试,和octave结果完全一样
    % n8 g: y* {1 [2 j9 m3 y) H
    6 P3 ^; a+ J" b6 o( T& J; l6 O: w红色部分是内循环,现在其内部操作都comment out 了, j0大概是 6000。
    ! Y8 x! T3 C! ~) l$ B0 L现在call xcorr 100次,耗时78s.+ F: V3 H4 k; A% h

    0 ^! r0 J: z, e9 q7 j如果把红色部分内循环本身完全comment out, call xcorr 1000次,耗时 <1s. ( _: @8 \( q, C/ {

    8 Z& K7 k" B! t1 n
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    擦汗
    2024-9-2 21:30
  • 签到天数: 1181 天

    [LV.10]大乘

    6#
     楼主| 发表于 2022-9-25 00:17:17 | 只看该作者
    风雨无阻 发表于 2022-9-24 23:33
    4 A/ q. @# I8 ]Maybe Debug mode?
    * n4 `# z+ B9 z1 i. L" @8 r! R' ~

    3 J, n: y( ]8 b( d* z不应该,看我上面的回复。
    % x9 K" P1 n) v
    . D# W! W5 t% J: g$ R1 ]8 S我更怀疑是 VS 社区版的问题
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    昨天 00:26
  • 签到天数: 1733 天

    [LV.Master]无

    7#
    发表于 2022-9-25 00:20:10 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 00:24 编辑
    9 Y/ a2 _9 m/ Z( g* R6 I
    雷达 发表于 2022-9-24 23:547 ]1 q- z, m: V
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    2 T5 {1 m, A2 E. G' W{
    , r  h2 a: ~. v; n/ X0 f        comp temp, xtimesy;

    8 I( g" ~; g; L" r( N2 U9 l: }: G0 i
    ( [7 @3 E, Y+ M! _: i" L+ l这个不是这么比的吧。。。
    9 b# M2 P' d; j. w8 @& z0 L3 @! N" I, v4 a' P
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    9 v0 S  {+ n0 n0 ~0 R" M1 G; M, d$ j
    ) c+ d9 W9 L/ J# a' T* D$ a而加上内循环,光jmp和dec指令就至少多执行了6000个,慢个几十倍不是正常的么?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    擦汗
    2024-9-2 21:30
  • 签到天数: 1181 天

    [LV.10]大乘

    8#
     楼主| 发表于 2022-9-25 00:46:56 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 01:09 编辑 4 w! I$ G9 r( Q% s% \& l) j
    数值分析 发表于 2022-9-25 00:20/ Y- f. R7 E2 d' }8 A
    这个不是这么比的吧。。。
      }# B" N1 w" S9 ]3 ^' ]6 r; [) }* c* x9 h0 p
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。

    , s8 r- S& v. L9 E0 d$ ^# I( N
    : B/ e0 ~* a# V3 W- T3 Y有道理。: C1 M, b  x% W+ [  q1 p
    所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,记得 numeric 库里有算向量内积的,我回头试试。
    2 }  d1 m7 {) O' p( y: h+ P; I+ `9 x$ J2 ?2 X( S9 {1 x6 q# C, ~0 y
    我先尝试尽量用标准库,一个小程序,不想搞得太复杂。多谢了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    9#
    发表于 2022-9-25 01:27:53 | 只看该作者
    雷达 发表于 2022-9-25 00:46
    3 z3 S7 W/ P" V+ j' t' i- V) w3 w有道理。6 B6 k: [3 c7 t
    所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,这大 ...
      _9 |9 J9 l2 V# x& n3 G
    你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子,把循环本身翻译成机器指令loop或dec/jnz,两者速度上会差很多6 Q: k- ~$ y* J# d) I' 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:201 b( I; ?8 w' U5 o# L- f2 K
    这个不是这么比的吧。。。
    2 Z6 B; T$ U+ v1 ?2 \' g! Z( Z/ f5 M; g, H
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    而加上内循环,光jmp和dec指令就至少多执行了6000个
    - f; d  K. S4 m
    : O4 j2 m7 Q! a1 [/ ]1 ]
    现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果循环这样跑,花不了多少时间。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    昨天 00:26
  • 签到天数: 1733 天

    [LV.Master]无

    11#
    发表于 2022-9-25 02:06:44 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 02:16 编辑
    8 }7 o8 |' N( X
    沉宝 发表于 2022-9-25 01:48
    ; E' O; i' B+ D% u; R/ q# L现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果 ...
    6 ?* s- u4 Y$ Q; q" q

    # ~6 J& ~: l' O6 ]' v( T是的,兄台说的对。
    3 {+ u, v% o7 ]* ^' G6 p9 o3 X/ T
    其实我想说的是 真正数值计算部分和代码中其他不直接计算的overhead的比值这个事儿。
    " S: d  r- X2 h# A9 m( D: t5 V) f
    9 [0 Y" D! c$ ^雷达兄构造测试用例的时候,屏蔽掉了所有计算的部分,使得剩下的都是overhead,这样run time比较的结果就显得好像不合理了。如果把计算加回去,计算部分的run time会dominate,结果就不那么离谱了。因为不好说,所以用指令数对比的方式试图直观地说明这一点。
    % Q1 Q& H; n- V' F: D( d* |* E: `  U% v& B. I( C
    比如说,如果有计算,那么跑六千个循环相对于计算应该用不了多少时间。但是如果一边是什么都不做,另一边是六千个循环,那六千个循环比什么都不做慢几十倍了,就不是那么不合理了。
    : I( O% q- g; L' y/ E/ U4 T6 ]: _0 f! A9 E, K  B' J
    当然也有可能像兄台说的,是优化参数的问题,但我觉得更多地是测试用例设计的不合理。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    擦汗
    2024-9-2 21:30
  • 签到天数: 1181 天

    [LV.10]大乘

    12#
     楼主| 发表于 2022-9-25 04:47:43 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 04:49 编辑 & _: L+ Q3 Q! B* h! Y7 Q
    沉宝 发表于 2022-9-25 01:27
    - q; ^% s0 f* s/ b8 E9 h你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子 ...
    ' F5 y9 t4 r4 c6 J+ S- {, {
    9 k. x  v, w8 L, i3 c
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差一倍,我上面这个差的太多了。
    ! M1 d2 h6 B: }8 v) k% v) L
    ( n+ Q2 O! u2 f, p& W' \8 r. W6 I* o我已经完全懵了。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

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

    8 Q: h; s; X; J6 q时间差一倍的结果可以接受。
    $ a8 A7 \; ~' |, b! R: ^1 G! I9 b  ^1 P5 i0 u! q  D
    你还是用profile工具看看吧。现在大家都主观瞎猜。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    昨天 00:26
  • 签到天数: 1733 天

    [LV.Master]无

    14#
    发表于 2022-9-25 14:58:59 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 15:38 编辑 8 C' F& o% \+ M  C% [, S
    雷达 发表于 2022-9-25 04:47* G) a6 Z( o; G. D2 t2 V
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...
    $ T) b- a, Z1 _' H: J% K; t

      Y' L& c3 u1 |# X( O8 I2 E0 U

    # c" H% k# Q6 O- h9 H: L7 U能不能把这个也贴上来,看看和上一个有什么不同?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    擦汗
    2024-9-2 21:30
  • 签到天数: 1181 天

    [LV.10]大乘

    15#
     楼主| 发表于 2022-9-26 01:30:03 | 只看该作者
    本帖最后由 雷达 于 2022-9-27 01:17 编辑
    * \. N" S, ~, V' N4 L
    数值分析 发表于 2022-9-25 14:58
    1 m5 k/ E  v  U" p7 X6 V* w能不能把这个也贴上来,看看和上一个有什么不同?
    0 G! S2 D2 X* k1 Z, P
    理了理思路,重新做了一个测试。" ^  {6 U  H" I6 K: X- x
    做了两个 vector 和 两个 float *, 都长 100000! }# I2 [' ?) g4 |! ^4 f
    外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.9 p# U4 D5 v6 B+ X4 W' e

    , M4 v  U  J2 G0 L) G8 S内循环试了4种方法,
    , w3 m+ E- K& e6 n1. 直接调用 vector inner_product 247s - \! L$ Y/ r* I6 x* x: ]
    2. vector 循环点乘累加 237s7 n, \7 }+ T1 x6 q; |4 T
    3. float * 循环点乘累加 204s9 v' k- |5 ~1 [6 S) A+ {9 O, f
    4. 空循环 100000 次 202s8 h% x6 L6 R! a) j
    * n9 X6 k1 x0 K3 f4 ]
    不做内循环 200s
    3 N  Z: a) V6 \7 {
    ' p' f! a3 ~& n& _4 M# ]你昨天说的对,内循环本身占比是很小的,大头在其他处理。
    ! `; q& l) [2 Y: D" `另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
    * s! d& {! G" Q9 E- P
    " G. ?% c+ h# N* l. S至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)# w( I$ U- ~. Q
    , ]. R) i; t: T2 h7 D: y
    (为什么下面我贴的  b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成  jj 好了,原来 方括号里的 i 是斜体标志  LOL): S/ \. [6 O9 J
    , d/ T9 V! P- R: K+ ]
            std::vector < float > vec1(N);
    0 O% R6 z3 s6 L( I' ]& Z        std::vector < float > vec2(N);" J7 m" C. M% t! S: u& K2 g
            float* b1 = new float[N];- N3 D3 S6 H9 D9 z1 a# M
            float* b2 = new float[N];" y; x& w7 ~* Z, j
    * R& T5 H" f. \9 [* z
            for (int j = 0; j < 6000; j++)
    ' U; w5 Y3 e( b' {! s        {
    / O7 @! e8 X- q5 M% U; _                std::generate(vec1.begin(), vec1.end(), []() {' Q" B3 I! D9 r- A3 v5 u: I$ b
                            return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;, F6 i1 T! z. E0 Q/ p. B
                            });
    ( D& F. r7 O' J$ M# p0 Q# @
    6 [! ~+ c! S+ Y7 u                std::generate(vec2.begin(), vec2.end(), []() {. ^0 W9 w" A* u( o
                            return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;8 P+ \2 S7 Y: q0 W! y7 F& z
                            });& }0 ?4 d; h# m
    ) ~7 q8 E$ l& b) i- [0 d
                    for (size_t jj = 0; jj < vec1.size(); jj++)
    5 q9 m2 W" v5 A. [2 Q, V- G6 ]                {/ {0 W3 ]' X5 q5 C" L
                            b1[jj] = vec1[jj];
    8 s& x- Y  a/ N$ H                }5 y" d0 ?, S3 P1 k. ]! r4 n% R

    3 `5 ~" I& ~8 q3 K/ U                for (size_t jj = 0; jj < vec2.size(); jj++)
    % ~. p7 p) N: b3 p8 S( m                {
    & W/ p: Y- z$ l- W/ Q* f& w                        b2[jj] = vec2[jj];
    8 W2 r5 I5 t. m* o/ S3 k. W( E* }                }
      R! }/ [7 M* g: @5 @, H% y/ K% i( N! T% h! e& o  y
                    //Method - 1  N=100000 247s  & D) E. @0 u" g+ F: o8 A' r
                    //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
    " H) \1 C0 g& C- R% P                                $ a: N7 z, F5 G) a  w; L" u0 ]
                    //Method - 2  N=100000  237s
    9 L% }: ?9 t" S% H" }9 K6 b                /*. Q  Y; u8 b* U3 B3 b0 V( W
                    for (int jj = 0; jj < N ; jj++)6 h9 X% I/ F! u! C4 U
                    {2 D) V2 f; L7 {0 D' H. ]# @- b
                            fresult += vec1[jj] * vec2[jj];
    3 c6 D: c) {1 ~* W                }
    ) F# X* i/ n( `                */
    ' O0 Z' S6 i3 E$ Z" k/ l                                6 E2 Q0 }" s8 R  B
                    //Method - 3  N=100000 204s
    ! ^5 o4 O; G3 |2 j9 q                /*, g( E8 \/ F; l$ i! N% {; x
                    for (int jj = 0; jj < N; jj++)9 {# U* Q4 s7 i' }
                    {1 m  w, ]# ?0 G% f9 r/ O
                            fresult += b1[jj] * b2[jj];9 Q6 H: _1 s6 R8 `
                    }$ [1 @( i* a4 s$ L- s- s: q
                    */5 Z& V4 f' s$ j" l: Z% x

    & Z2 ]7 ^! X- G                //Method - 4   202s
    ; U5 e* ^/ [% J                /*9 B7 N9 P* a* M1 O0 x& Y* \
                    for (int jj = 0; jj < N; jj++)
    . U  M0 k* @& [! \. I9 K" f3 |                {
    * {& z) ?( [$ g* \8 i                        / P- }1 ]$ b) i' R
                    }% \9 f# |/ B% a" ]0 u: B
                    */- [8 X/ P5 T' R  V; v7 J
                    //comment out all methods, N=100000  202s                ; U* c: }) j! B7 l9 y
            }6 _7 H* b" y: v# A
    , _8 t) D6 C) L  M6 V7 z# [4 B+ g
            delete []b1;& }) Y: q/ a/ e# y7 R
            delete []b2;
    3 |/ C; n* w2 p# Y
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    16#
    发表于 2022-9-27 00:15:38 | 只看该作者
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?
      [" N- y6 s* l+ ?: q) t8 h; z
    2 e- u! l6 K) G, V6 Q, a, o你第二个试验里面的j在循环里面又重新定义了啊,你确定真的跑了6000次?
    7 w; O; x8 C6 ^8 }4 D1 P
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    擦汗
    2024-9-2 21:30
  • 签到天数: 1181 天

    [LV.10]大乘

    17#
     楼主| 发表于 2022-9-27 01:16:03 | 只看该作者
    机器猫 发表于 2022-9-27 00:15& V* J; I( n# U0 l; g5 y
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?
    1 S; |( i* X8 Q1 r! M3 Z  K: j3 V/ X: D% F  ^
    你第二个试验里面的j在循环里面又重新定义 ...
    5 H3 U( l, ]/ z( A
    内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL* v) _; H& j, h6 s; U- R+ X

    $ G3 P) L2 G9 o. B" b) E1 l不和它较劲了,瞎耽误工夫,我已经转到 ubuntu, 也准备顺便试试 avx2 向量化。
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    18#
    发表于 2022-9-27 02:06:58 | 只看该作者
    雷达 发表于 2022-9-27 01:161 a, x4 O" ^: D
    内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL; r" Y+ T$ T6 l% |$ ?9 x1 m. A$ x9 W

    3 X" W% ~& p, ~7 G& `. K+ E不和它 ...
    ( K" ^, [6 X/ k" _0 e+ F& u5 \; @

    / }9 X( W( h( B; [不过可以试试我说的register变量。前一个试验j是混在一堆其它变量里一起定义的,很有可能是在stack上,这样内存读写会更多,要是再碰上每次都需要加载cache就更慢了。; i  K7 \1 z7 ?) l6 p% G
    后面一个是在循环那里定义的,说不定编译器就把它优化成register变量了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

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

    使用道具 举报

    该用户从未签到

    20#
    发表于 2022-9-27 20:29:50 | 只看该作者
    雷达 发表于 2022-9-24 23:54
    " A& t) a. L* z: V% y+ D: Uvoid xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)9 t! {4 K" `- ~& n
    {, H& @- c9 [- S( j* X
            comp temp, xtimesy;

    ; D8 z2 t- E& O2 S- Z8 p9 y这个code里面如果Openmp没有被注释掉的话,那么temp那个变量应该是定义在循环里面,否则线程之间会存在争夺写入那个temp的风险。9 b0 j; D( [7 y- W
    内层for循环如果没有内部操作的话,编译时应该被优化掉了,和你完全注册掉整个循环是一回事。可能你的编译设置没有打开优化?, |9 C: N. c8 C
    VS社区版没有问题,我工作用的就是社区版,设置正常的话不会比商业版差。以前游说头头用Intel Compiler,他说不想花钱,而且差不了多少,就一直用到现在。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2024-12-4 02:33 , Processed in 0.057656 second(s), 20 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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