设为首页收藏本站

爱吱声

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2022-9-24 22:54:26 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
    C++ 比 Octave 慢好多,怎么破?7 f+ R5 h$ b4 _) W6 G: e
    0 q- D* N( x" ]2 S6 `5 N4 I1 n: _9 }
    自相关两层循环,内层循环涉及浮点数计算,试验了一下把内层循环内部全都 comment out 只留个壳子,  但空的内层循环本身就把速度拉下来了,看来问题并不在浮点计算。' z: l, p$ E, o9 H/ t

    * _* O' ]+ H0 R5 u5 @速度优化问题真的很有意思啊。, o1 P" [5 S/ s* \( ?. \$ T1 e3 c

    . _4 F( e7 s7 y. F5 A1 E* i欢迎大家继续讨论

    评分

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

    查看全部评分

  • TA的每日心情

    6 小时前
  • 签到天数: 1809 天

    [LV.Master]无

    沙发
    发表于 2022-9-24 23:04:16 | 只看该作者
    拉下来?拉多少?
    . I9 A! T& a+ B把代码贴上来看看?. C9 ~4 n2 F5 S: N

    7 r. \7 d# A4 P! K4 P难道分支预测不准破坏流水线执行?不该啊。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    板凳
    发表于 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 编辑
    / V2 \! X6 e. H# Z8 {" ~
    数值分析 发表于 2022-9-24 23:04  t: U3 [) g& }' r/ e( J
    拉下来?拉多少?! b6 ~% k- s% F. n/ s5 @
    把代码贴上来看看?

    * K" N! |* y% h  Z4 _
    9 p) I6 n  Z1 Avoid xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    ; c& S: r2 z* V. Z2 i5 r{+ ?8 C% t% v9 N; ]7 Y. t
            comp temp, xtimesy;" e  W: W' H+ h; \
            xtimesy.re = 0;
      i3 i( z2 R7 w        xtimesy.im = 0;
    ; Y, Z* N# c; J9 Q. u        int j0 = lenB - 1;( {; K* u6 c  P
            int    i, j, i1, reali;! z# A$ p& E- b3 e
            if (lenA % 2 == 1)1 I4 [& D, r, L' ?9 \+ M
                    reali = lenA + 1;
    + K2 m. F. _. ]8 V, U1 S        else3 j. G/ l! y5 u
                    reali = lenA;
    2 O# N  \- K* W& Z9 O2 c        reali /= 2;2 i- x  ~' j5 y# [  n
    0 w8 }4 ~/ m  C; d# L! i
            int nconv = reali + lenB;
    6 b. I+ p9 s1 b( u/ @' B. n9 O) W% m        //#pragma omp parallel for# N$ U6 `; a4 Y0 T  v
            for (i = reali; i < nconv; i++)
    : R) M! k" A- r% v' d        {
    9 m) W7 J; V; }6 F( P9 ?7 @                temp.re = 0;
    3 F* ]3 k/ S5 m8 G9 x% h                temp.im = 0;' v# t+ |' Y# Q, M6 N
                    i1 = i;2 n3 H& d' {8 g4 [' N9 T1 n( Z
                    for (j = j0; j >= 0; j--)
    # T% G: N8 `' A1 R8 S- E; t                {
    ! X) z2 G7 e2 f, I8 u                        /* floating date operation */' K( {# I$ q* ~7 F, ]
                    }

    / u9 W& R( \/ T' n: K        }6 B$ y' g1 u) ^
    }
    $ _: z* r% n' g
      w" m9 Z- ~- b* |xcorr函数代码如上,comp是复数struct, 做过长度为11、19两个矢量的测试,和octave结果完全一样
    * Q0 n  t% _7 r+ f& h0 I
    * B% J0 W  b1 X+ g红色部分是内循环,现在其内部操作都comment out 了, j0大概是 6000。
    + l2 W( F6 v2 W现在call xcorr 100次,耗时78s.
    0 g" O" n0 P0 a: W' A% o, u8 q
    3 r( l; S" y, X* r: a如果把红色部分内循环本身完全comment out, call xcorr 1000次,耗时 <1s.
    : _  e+ H7 e9 g# @/ ]5 e4 C3 e8 R3 y5 M  e
    回复 支持 反对

    使用道具 举报

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

    [LV.10]大乘

    6#
     楼主| 发表于 2022-9-25 00:17:17 | 只看该作者
    风雨无阻 发表于 2022-9-24 23:33' t7 U$ P0 U  Q2 C# w2 Y% w
    Maybe Debug mode?
    0 z" W  g6 v' G$ g* ]

    6 _9 o+ p/ P9 |" \不应该,看我上面的回复。
    ) \) ~5 A! a3 Q9 c0 t2 o, Z9 @3 Y6 F+ t9 _2 `: [
    我更怀疑是 VS 社区版的问题
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

    6 小时前
  • 签到天数: 1809 天

    [LV.Master]无

    7#
    发表于 2022-9-25 00:20:10 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 00:24 编辑 " i1 c' H6 u1 e8 V# Z2 v$ L
    雷达 发表于 2022-9-24 23:542 C1 [. B6 v- c
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)' P7 ?8 Y2 B' M- @. L& G. \
    {  v/ S( Q: {+ W7 r3 C1 A8 r
            comp temp, xtimesy;
    + L( p) s& h1 w: C8 Z+ _  H$ m0 _, j
    5 L+ g' E8 y8 X  |7 |* [  }
    这个不是这么比的吧。。。% i( [6 ~" \2 A; u& d9 Q
    & s5 s& ]2 C0 t3 {) G% R
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。8 M- L8 c/ V' y* z

    0 u" M  V, q& g+ ^; N6 f! ?而加上内循环,光jmp和dec指令就至少多执行了6000个,慢个几十倍不是正常的么?
    回复 支持 反对

    使用道具 举报

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

    [LV.10]大乘

    8#
     楼主| 发表于 2022-9-25 00:46:56 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 01:09 编辑
    2 h6 q1 c6 f6 p) h2 D
    数值分析 发表于 2022-9-25 00:20
    + |# o! N/ L: L6 z$ [( M  [7 c这个不是这么比的吧。。。
    2 F5 j$ }) N, \! F/ [9 Q8 k7 I
    / X! Z1 y% l# H您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    ) b; P. Q1 h/ v; c( A& {
    / j, k, J9 c4 \
    有道理。
      ?& S' {) ^3 V; U; u9 Z所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,记得 numeric 库里有算向量内积的,我回头试试。
    6 h: l' K8 T" r; Z9 H
    : g' J/ _+ _8 }4 P" m7 j我先尝试尽量用标准库,一个小程序,不想搞得太复杂。多谢了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    9#
    发表于 2022-9-25 01:27:53 | 只看该作者
    雷达 发表于 2022-9-25 00:46
    ; U# T$ K( }- Q* e9 p. F有道理。
    " T4 T- _8 s3 j3 Z! j8 O4 c& `所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,这大 ...

    % |. |/ h, G( d8 Q4 [9 K, c. G' k你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子,把循环本身翻译成机器指令loop或dec/jnz,两者速度上会差很多
    # v: P2 O  l! JWhy is the loop instruction slow? Couldn't Intel have implemented it efficiently?
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    10#
    发表于 2022-9-25 01:48:51 | 只看该作者
    数值分析 发表于 2022-9-25 00:20
    8 B# C; g: t# m/ d$ b这个不是这么比的吧。。。9 a& w1 s1 ~/ L+ F7 t7 Z
    & ^) U1 j9 f7 H# ]  I- k& S
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    而加上内循环,光jmp和dec指令就至少多执行了6000个

    # O! h3 a" ^9 n0 I8 ]0 x" c. H! w; u, c$ T
    现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果循环这样跑,花不了多少时间。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

    6 小时前
  • 签到天数: 1809 天

    [LV.Master]无

    11#
    发表于 2022-9-25 02:06:44 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 02:16 编辑
    , N" a9 R# N5 u& L: G, A: j
    沉宝 发表于 2022-9-25 01:48
    ! H5 q- a5 \" d: t现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果 ...

    % k- Q: U' G) m5 [/ N/ N4 X8 H' z+ s; b7 C9 {+ Q4 T/ |  z4 ^
    是的,兄台说的对。# }+ d. w& B  q% Z7 T2 g; l
    2 u. `5 Q" O2 D
    其实我想说的是 真正数值计算部分和代码中其他不直接计算的overhead的比值这个事儿。
    5 _5 G. N7 q5 K9 z! {  y
    " n. S: t' b) |% C3 _雷达兄构造测试用例的时候,屏蔽掉了所有计算的部分,使得剩下的都是overhead,这样run time比较的结果就显得好像不合理了。如果把计算加回去,计算部分的run time会dominate,结果就不那么离谱了。因为不好说,所以用指令数对比的方式试图直观地说明这一点。8 t, X; a* @0 G# S9 _& `& |4 w
    9 c  H. h5 T6 E* M+ h) M
    比如说,如果有计算,那么跑六千个循环相对于计算应该用不了多少时间。但是如果一边是什么都不做,另一边是六千个循环,那六千个循环比什么都不做慢几十倍了,就不是那么不合理了。
    2 h' W. \  X' T9 F: Q. c6 k. V3 L1 P
    " S' E: t+ i  h1 P1 {  C& P2 L+ w当然也有可能像兄台说的,是优化参数的问题,但我觉得更多地是测试用例设计的不合理。
    回复 支持 反对

    使用道具 举报

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

    [LV.10]大乘

    12#
     楼主| 发表于 2022-9-25 04:47:43 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 04:49 编辑 ! m7 T0 `: v# p. ^
    沉宝 发表于 2022-9-25 01:27; A/ t/ Y3 m3 H; \& S: W- ?3 D, P$ F: L
    你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子 ...

    $ p. l9 c+ D6 Y# S* O: u+ i+ E7 F/ i; s$ U4 W& v3 h  O3 h
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差一倍,我上面这个差的太多了。
    6 \- a) e9 m( G2 {6 d* u7 ^4 `# I2 ]5 d+ w0 O
    我已经完全懵了。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    13#
    发表于 2022-9-25 05:51:23 | 只看该作者
    雷达 发表于 2022-9-25 04:47
    0 U5 S/ D9 I5 G! b) U: B6 q0 D1 K4 s又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...
    8 i. E" N0 i4 a! m, E# E: n8 m. `
    时间差一倍的结果可以接受。* t7 n+ f$ L2 n- {" \! t
    . Q4 ^) c, Q! E/ s+ l$ f) P
    你还是用profile工具看看吧。现在大家都主观瞎猜。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

    6 小时前
  • 签到天数: 1809 天

    [LV.Master]无

    14#
    发表于 2022-9-25 14:58:59 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 15:38 编辑
    7 e3 a! h8 u- l$ v! p$ i5 Q
    雷达 发表于 2022-9-25 04:47
    * B3 t1 v  s% f, _, N又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...
    * w1 w% Z  r! T* |) \& W
    1 N2 I3 @( Y8 Z" l# o3 n; O

    # P- G! {& c7 W; g& U( T* @7 i3 F" A' @2 v- K) n/ U  Q* d) x
    能不能把这个也贴上来,看看和上一个有什么不同?
    回复 支持 反对

    使用道具 举报

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

    [LV.10]大乘

    15#
     楼主| 发表于 2022-9-26 01:30:03 | 只看该作者
    本帖最后由 雷达 于 2022-9-27 01:17 编辑
    ' x! h# j  P, A; r- l. N, J
    数值分析 发表于 2022-9-25 14:58
    0 w1 e- O  ~- F3 Q, b3 T能不能把这个也贴上来,看看和上一个有什么不同?

    ( j8 h/ _$ @7 V# N1 f- i( n理了理思路,重新做了一个测试。
    4 y1 u- h7 |4 G+ y4 v" L4 W做了两个 vector 和 两个 float *, 都长 100000
    5 s' F& m! s- P3 x外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.1 _+ Y: s' ~& p2 l
    " @  k* a/ B9 ^% W& L' i. v
    内循环试了4种方法,! N- f/ e: l( P' `: \4 A8 ^
    1. 直接调用 vector inner_product 247s
    7 U7 }' x7 T5 e: j# i2 x2. vector 循环点乘累加 237s4 R7 Y: J" k# s5 W* S
    3. float * 循环点乘累加 204s
    , R1 x* k; A# H/ P7 Y4. 空循环 100000 次 202s
    5 h! E0 g! y4 j9 K2 w( v$ B* l
    8 v# C+ U, H- S( {% P* f不做内循环 200s/ u6 `/ s) V% I. }/ J  J

    * }7 y9 h. N" ~% @1 l你昨天说的对,内循环本身占比是很小的,大头在其他处理。
    8 \. H) X- J# _6 f另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。* T* o9 w: ^3 X( J, q4 l

    9 Q6 G2 j. S$ [至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)1 i  C( L7 b0 a; x# k
    ) K2 `" r& C- Q: s! p
    (为什么下面我贴的  b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成  jj 好了,原来 方括号里的 i 是斜体标志  LOL)" T6 z- X% S3 \, A% Z- p
    1 g9 S. ?0 c+ j; ]5 N  p" L) R- e
            std::vector < float > vec1(N);
    # g" l, l' K0 l6 S+ G        std::vector < float > vec2(N);* j6 ?8 l2 N& R# l" Y. c
            float* b1 = new float[N];5 C; {" ~: A7 K
            float* b2 = new float[N];
    4 m2 |8 p/ q! j' O: n
    . x8 n6 h( d% ?* `  q        for (int j = 0; j < 6000; j++)4 U* X; y( ~, j, a
            {% A* B$ @3 E4 q" w' W
                    std::generate(vec1.begin(), vec1.end(), []() {
    ( r  }/ v" ~; Z+ S: j8 _7 Z/ a3 S                        return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
    6 z* _6 X' k0 C& A4 L) F6 b) u                        });. B3 K; f  g- y% W& X& d- T

    - ]; ]' B) A2 Y3 O8 y                std::generate(vec2.begin(), vec2.end(), []() {/ ^% p. V. }% p- {/ I
                            return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
    2 J' ~, w, v2 {8 W. j. d* m                        });$ P3 z3 _5 ]5 ~$ f* L6 N7 B

    ! ~3 F* u. k* d1 K# G+ v4 \                for (size_t jj = 0; jj < vec1.size(); jj++)
    ! w2 [) U* \' z" f                {
    * U2 n+ K/ `3 Y, V8 Z% g3 A7 l                        b1[jj] = vec1[jj];
    / j6 A/ {9 C, \4 o                }" t, e; I' r4 G" _% z5 U
    1 n' P1 B1 `+ X
                    for (size_t jj = 0; jj < vec2.size(); jj++)- t/ p1 d0 K3 E6 y/ V" C$ K7 L
                    {% U6 i' J5 ^! X; c) ~" W- |
                            b2[jj] = vec2[jj];
    8 ]; ]0 l6 e% Y0 j6 M                }
    0 V7 Y' {! F! y( J+ W, G" R' A. y; Y% l5 W
                    //Method - 1  N=100000 247s  
    3 l* B* [/ K' ^/ I8 v8 v                //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);. v+ I. V  y8 z, M& o
                                    
    : p# u6 G2 ?  a' X$ E( D- J                //Method - 2  N=100000  237s/ r0 Q( E3 L8 j. W2 B, w. \
                    /*
    ; l! e- c% {, Y  I: L2 B; E                for (int jj = 0; jj < N ; jj++)
    ) v. B9 e  F  O( a* w1 O                {8 y( B$ k" H" V/ P
                            fresult += vec1[jj] * vec2[jj];3 x6 Y  m( e) g
                    }
    $ h2 ~* O5 m  K- @1 v" m  r                */2 {5 t+ |# `0 s" A( G' o
                                    % M0 t' d7 D+ [! A$ J, v
                    //Method - 3  N=100000 204s
    % w7 I5 g% L3 i& j, L                /*
    6 n$ @# L# K+ M& K( d                for (int jj = 0; jj < N; jj++)5 h0 h# o- S7 {  u2 X
                    {
    - K0 A  |6 ~1 K& Z# |                        fresult += b1[jj] * b2[jj];
    * z4 ?2 c+ r3 Z7 H# x2 t3 q                }8 u, X& O0 n* b: ~# G/ c2 p
                    */6 \+ _/ c/ a: n9 B' Y

    # x: S; T5 c0 M; p( b; M4 z# F7 \                //Method - 4   202s4 f5 j0 p; Z# l0 W! i
                    /*
    5 l& J: B; Z: x* q6 j) k( }3 B                for (int jj = 0; jj < N; jj++)
    ) y& j# T/ N9 B                {; w" K. ], I3 n% n( f  g
                            
    " W. y7 S* w) y                }
    ' O3 F+ V  a0 A! E5 [                */
    ) c8 ~5 D, |. ~! y                //comment out all methods, N=100000  202s               
    " d9 R7 ]: Q* [& H        }1 x% M) l0 f7 B5 K+ Z! L, _

    3 X& y' P* P7 m: w        delete []b1;& R0 \2 l2 Z) i& v8 O4 B
            delete []b2;

    / x' S% E7 i- N5 n5 n0 p
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    16#
    发表于 2022-9-27 00:15:38 | 只看该作者
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?
    & U& p7 l( N6 K& D" G6 I  V7 p. G' V
    你第二个试验里面的j在循环里面又重新定义了啊,你确定真的跑了6000次?
    ' f$ e: L; ^9 G7 ]7 b; N
    回复 支持 反对

    使用道具 举报

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

    [LV.10]大乘

    17#
     楼主| 发表于 2022-9-27 01:16:03 | 只看该作者
    机器猫 发表于 2022-9-27 00:153 N! g5 P" r9 Q5 Q# D* n
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?
    ) L8 o! M' d/ v7 j$ I# m% R' w7 `9 W8 n! ], B
    你第二个试验里面的j在循环里面又重新定义 ...

      L% q4 n9 K# G, [5 o内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL3 _! q6 U3 k$ l' z+ o

    * N1 I: W+ Q2 D2 `9 X# D' q- Y不和它较劲了,瞎耽误工夫,我已经转到 ubuntu, 也准备顺便试试 avx2 向量化。
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    18#
    发表于 2022-9-27 02:06:58 | 只看该作者
    雷达 发表于 2022-9-27 01:16
    $ R" g3 B4 c6 T) P内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL
    0 \6 T: c. Y0 D7 P3 h
    * h$ j# h) X- p8 x4 ~3 k/ }不和它 ...

    + I# R( c! y  j' v1 O8 G9 z/ U& g; D
    不过可以试试我说的register变量。前一个试验j是混在一堆其它变量里一起定义的,很有可能是在stack上,这样内存读写会更多,要是再碰上每次都需要加载cache就更慢了。& j5 h' ~0 I! j' H+ y" _8 e4 q- ^+ {- }
    后面一个是在循环那里定义的,说不定编译器就把它优化成register变量了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

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

    使用道具 举报

    该用户从未签到

    20#
    发表于 2022-9-27 20:29:50 | 只看该作者
    雷达 发表于 2022-9-24 23:54
    ) _$ c9 S6 ]% Y% a' ^% mvoid xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    : Z5 A' b( Z4 P! d{- }  V6 g# B3 A- l
            comp temp, xtimesy;

    1 L- X: Z  n! ~& j8 ?% R2 H这个code里面如果Openmp没有被注释掉的话,那么temp那个变量应该是定义在循环里面,否则线程之间会存在争夺写入那个temp的风险。/ l: F  v3 h0 j' J! r, S
    内层for循环如果没有内部操作的话,编译时应该被优化掉了,和你完全注册掉整个循环是一回事。可能你的编译设置没有打开优化?
    6 v: d) E4 P7 lVS社区版没有问题,我工作用的就是社区版,设置正常的话不会比商业版差。以前游说头头用Intel Compiler,他说不想花钱,而且差不了多少,就一直用到现在。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2025-2-19 06:32 , Processed in 0.045080 second(s), 19 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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