设为首页收藏本站

爱吱声

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

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2022-9-24 22:54:26 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
    C++ 比 Octave 慢好多,怎么破?
    : U) K/ g2 I8 q6 H) T% f9 }" V! ^2 `# U6 W/ W# `
    自相关两层循环,内层循环涉及浮点数计算,试验了一下把内层循环内部全都 comment out 只留个壳子,  但空的内层循环本身就把速度拉下来了,看来问题并不在浮点计算。
    : o' _: F  K6 s9 H. |1 l: F. P
    ) U; Q+ [4 y, b8 a速度优化问题真的很有意思啊。7 B) v# a0 ~% T& r. ~2 c8 w9 Z" L, L

    ; ~7 Z. |- c7 k; Z1 M/ Z. z" v欢迎大家继续讨论

    评分

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

    查看全部评分

  • TA的每日心情
    开心
    2025-10-27 04:12
  • 签到天数: 1953 天

    [LV.Master]无

    沙发
    发表于 2022-9-24 23:04:16 | 只看该作者
    拉下来?拉多少?
    * _. `' l- ]# y) _9 }% d把代码贴上来看看?
    3 Q, r4 L9 w, q5 G& v$ R& ?5 `. H# @8 @* G: T; p
    难道分支预测不准破坏流水线执行?不该啊。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    板凳
    发表于 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 编辑   s0 w5 g) U5 B9 J& W! |$ |7 N
    数值分析 发表于 2022-9-24 23:041 T: T  W; j8 k, Z5 S
    拉下来?拉多少?5 Y  `) n3 ~; e( o! |# z
    把代码贴上来看看?
    - s9 Z3 _" @4 S4 I
    ' E8 M0 z! [0 |; P
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    7 I  N" h1 O! I) o! ~! B. J{
    9 C9 r* ?/ \- S4 P; y        comp temp, xtimesy;7 f3 {, Q" {. ~7 W8 T
            xtimesy.re = 0;
      j. a' n' {+ u) z/ U1 z* Y        xtimesy.im = 0;, |6 @- Y) E& }% r1 b! V8 |/ Y) t7 w
            int j0 = lenB - 1;
    , c/ o( M1 Y; Z3 c$ V9 t' j8 C        int    i, j, i1, reali;
    , j( z# C9 ?- S8 c4 w        if (lenA % 2 == 1)
    . s8 J6 j7 a0 I( u/ [" i# K# @                reali = lenA + 1;
    " n) q2 o* D* `7 k: Y- g        else  x3 R- l! P6 z% L4 }* ~
                    reali = lenA;
    # Y% d8 v/ d$ H( C        reali /= 2;6 X0 M- b+ P7 t5 J" _9 o1 h
    1 Q  k% ^# U+ w# w. A8 r
            int nconv = reali + lenB;. c' D6 S4 P! m! y# T+ T! n9 ?" ?8 q
            //#pragma omp parallel for7 [: u, e7 {: ~. B5 E
            for (i = reali; i < nconv; i++)
      C9 T9 j; W. ^: \- ~$ _% @: z9 \        {
    1 A* f- Q/ p' M$ E0 b                temp.re = 0;
    9 u' }+ T" }+ S; X                temp.im = 0;
    " f* d9 {" M* _                i1 = i;
    ; x/ W4 U2 f/ _& L                for (j = j0; j >= 0; j--)
    / x0 q2 q6 Y1 v+ l                {
    5 W% @  j" E8 W* I$ T                        /* floating date operation */- C& m) F: z3 c% M8 }9 q6 D# f
                    }

    , s  X8 I( D8 B9 x' }5 I' h2 u        }% D8 r6 p, E. f$ e7 t
    }
    # G7 Q1 z$ N7 a( }* @
    ! t/ t0 c4 d7 r+ t+ ?( d- X3 ~xcorr函数代码如上,comp是复数struct, 做过长度为11、19两个矢量的测试,和octave结果完全一样6 Q0 r7 u6 h4 M

    ; O  g" [7 ]* `- U  s& t" E红色部分是内循环,现在其内部操作都comment out 了, j0大概是 6000。2 }6 E/ I: q& O( E; W
    现在call xcorr 100次,耗时78s.
    4 v" L/ o6 f. K* `% g/ T
    + ]+ c- V/ S  a如果把红色部分内循环本身完全comment out, call xcorr 1000次,耗时 <1s.
    1 C; V' \# ]" A: Z" u- C; ?, c2 |3 q( ^6 b
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    6#
     楼主| 发表于 2022-9-25 00:17:17 | 只看该作者
    风雨无阻 发表于 2022-9-24 23:33
    # _- ]! }; L$ rMaybe Debug mode?
    3 L8 s( k; V% S- B% o* q

    - }0 y/ g1 ?0 b$ i不应该,看我上面的回复。3 n; h0 w, ?! f2 n; x

    % c4 i; [! j8 o: q3 i1 d我更怀疑是 VS 社区版的问题
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2025-10-27 04:12
  • 签到天数: 1953 天

    [LV.Master]无

    7#
    发表于 2022-9-25 00:20:10 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 00:24 编辑
      r! |( _0 F' S% J; s3 q& o% @. A& I
    雷达 发表于 2022-9-24 23:54
    0 r' H* S- W# P) T# dvoid xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    0 X5 q$ [$ R4 z  K0 M" w{2 _+ s' L: u- S7 u' ]) m& w  w6 a3 Q3 `
            comp temp, xtimesy;
    5 }( b% F( n. j  D! y
    1 t2 Z2 N+ A+ z# v% S
    这个不是这么比的吧。。。
    ' A/ z% F% I" o% q) u; t! k, R
    7 V+ E  F: r  ^2 X' F您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    8 X: `6 }7 H8 e* K7 x! w) s$ Y3 _# h% Q# i) y: W! d+ [: ?
    而加上内循环,光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& [! O9 |, z7 d4 X5 c: p
    数值分析 发表于 2022-9-25 00:20
    . I4 h' M, F: M; J& n. G5 \1 B1 p这个不是这么比的吧。。。
    * J# v9 d5 q' j0 r2 h3 P( K  B) w1 X* o, J" R
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    - f8 \. u/ |8 K" t( T) X! V, _4 X2 J

    ( A/ T5 t8 ~( V4 T: g3 R有道理。
    ; J# V5 [# h& L- I+ c8 n. u% G- N% d所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,记得 numeric 库里有算向量内积的,我回头试试。: x- P0 R; N( s7 u
    ' c: d- n. d- l, A7 v3 H) f5 `# L/ `
    我先尝试尽量用标准库,一个小程序,不想搞得太复杂。多谢了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    9#
    发表于 2022-9-25 01:27:53 | 只看该作者
    雷达 发表于 2022-9-25 00:46) n& c0 t% `: O$ T+ R: R, a) q
    有道理。5 G& A7 F1 [  L2 Z8 r1 p
    所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,这大 ...

    1 r* G) J  t0 _- `  v你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子,把循环本身翻译成机器指令loop或dec/jnz,两者速度上会差很多( A) u  U, q  G% s8 x& y2 J) g
    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 y. }: b0 h# ?$ \
    这个不是这么比的吧。。。, x- W! v1 M7 ^3 l  ]3 g. \
    ' X: {2 @1 n9 X$ D8 O
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    而加上内循环,光jmp和dec指令就至少多执行了6000个
    * T8 i" B5 ]$ }/ W9 m% v3 a# Z% ~
    8 q/ k8 N6 H' m% N- E( l2 G
    现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果循环这样跑,花不了多少时间。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2025-10-27 04:12
  • 签到天数: 1953 天

    [LV.Master]无

    11#
    发表于 2022-9-25 02:06:44 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 02:16 编辑 $ ?. e$ T2 L4 X8 i# |. f
    沉宝 发表于 2022-9-25 01:481 o% y) S. z4 p- y+ n3 z
    现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果 ...

    " `- B+ L8 |8 c8 M7 b, h7 }- n5 r1 c4 Q/ l% j+ d
    是的,兄台说的对。
    ! _! v* B1 z, x$ D' x4 ~+ y( k
    " E& x, j( {  M& x其实我想说的是 真正数值计算部分和代码中其他不直接计算的overhead的比值这个事儿。
    + R2 b- \2 B0 [# f8 j& H  S5 P. u5 l3 b8 V2 J2 y2 H
    雷达兄构造测试用例的时候,屏蔽掉了所有计算的部分,使得剩下的都是overhead,这样run time比较的结果就显得好像不合理了。如果把计算加回去,计算部分的run time会dominate,结果就不那么离谱了。因为不好说,所以用指令数对比的方式试图直观地说明这一点。
    1 h& }! c6 d4 S2 r2 r
    * j7 ?( q) O1 G5 |" |比如说,如果有计算,那么跑六千个循环相对于计算应该用不了多少时间。但是如果一边是什么都不做,另一边是六千个循环,那六千个循环比什么都不做慢几十倍了,就不是那么不合理了。
    ' c: K2 k4 Y* u) S; @7 V8 }. L( G4 v1 a0 I8 N8 U- m  R7 B% E# k
    当然也有可能像兄台说的,是优化参数的问题,但我觉得更多地是测试用例设计的不合理。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    12#
     楼主| 发表于 2022-9-25 04:47:43 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 04:49 编辑 ! g0 K1 W* r, C/ y: l; I
    沉宝 发表于 2022-9-25 01:27/ B/ l5 P# a) i4 l* D
    你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子 ...
    ! R. `* K9 z+ F+ ?0 N* Z

    / x) S; u: G% m又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差一倍,我上面这个差的太多了。
    ; x9 f9 c$ U( k. t) b' o9 i% e! _( J: l' j
    $ ?; p( P' \+ Y, X( p我已经完全懵了。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    13#
    发表于 2022-9-25 05:51:23 | 只看该作者
    雷达 发表于 2022-9-25 04:47
    7 F. |9 Z- Z  e又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...

    - U( q' C; }$ g# w时间差一倍的结果可以接受。: ?4 M$ X  Y  [

    & R, H' {  Z+ H0 v) m, I0 g你还是用profile工具看看吧。现在大家都主观瞎猜。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2025-10-27 04:12
  • 签到天数: 1953 天

    [LV.Master]无

    14#
    发表于 2022-9-25 14:58:59 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 15:38 编辑
    9 |# ~7 l5 d% y  C; J( o2 l& u
    雷达 发表于 2022-9-25 04:47
    * H* [% x+ W( x' x; n1 `又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...

    ; |1 i: v/ x% c/ |# }$ m( \
    2 B, a! ~+ T6 }: V
    5 P" y" i& L7 p7 ]5 @" U+ }6 n0 ?" ]7 q  k* m5 m3 a2 s* y
    能不能把这个也贴上来,看看和上一个有什么不同?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    15#
     楼主| 发表于 2022-9-26 01:30:03 | 只看该作者
    本帖最后由 雷达 于 2022-9-27 01:17 编辑 : J5 \3 J, u: m7 K
    数值分析 发表于 2022-9-25 14:58( ?9 b( s7 z& m9 S% `% ^
    能不能把这个也贴上来,看看和上一个有什么不同?

    . `6 x; Z+ `8 _, @: {理了理思路,重新做了一个测试。1 C. D" k; t6 e0 k  y% `% L
    做了两个 vector 和 两个 float *, 都长 100000
    # n+ U8 S* H" o% x+ ?外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
    & u4 A& x; I/ |; s3 D8 c' Y" G
    ) }- \: g% d' y内循环试了4种方法,8 C. I) m$ M) ~7 Y! S3 U- k3 {
    1. 直接调用 vector inner_product 247s
    : m) J9 ?/ F; n0 G& e2. vector 循环点乘累加 237s; r, X9 r! H1 \. b$ Z9 F7 U
    3. float * 循环点乘累加 204s7 [2 Q' N' X9 x3 |) C* Z4 x
    4. 空循环 100000 次 202s, ~% E3 E; F; Y/ t; n1 k
    3 u9 W  e3 m" T- p4 u; f  f/ ~
    不做内循环 200s
    " R) Z' E# {1 x7 ^& F, A' V1 s7 Q* S% r; w* U
    你昨天说的对,内循环本身占比是很小的,大头在其他处理。
    - K! K2 G( G4 K# G* ^. C3 q( W. I另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。8 f0 R5 r0 _/ c1 l" @- _3 I
    6 d5 u9 R+ v& p& \
    至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
    $ c8 ?/ O# ^" D6 u' k
      [1 d  ], w; |5 @3 T% _2 @(为什么下面我贴的  b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成  jj 好了,原来 方括号里的 i 是斜体标志  LOL)0 B3 s& ?  L. U2 v4 B

    + k7 _2 T6 P: W% S# A- }7 s+ i) Q. a
            std::vector < float > vec1(N);4 }& `& N7 R$ i2 o8 W- D$ J
            std::vector < float > vec2(N);
    ) J/ |( X$ M6 e/ v# [        float* b1 = new float[N];9 B! E. k+ [3 g1 a/ }$ ^" F- X
            float* b2 = new float[N];: V. H2 i* }/ }
    / f; o8 v. p" b1 ^
            for (int j = 0; j < 6000; j++)
    ( c+ s9 F) e6 x( u9 Q! f4 _        {
    ( X) G; a$ M3 Y! M9 c. k                std::generate(vec1.begin(), vec1.end(), []() {
    $ I, H1 T' T+ e. b7 F! m) d( l                        return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
    : P( @/ X: V" y5 l9 [5 |7 U                        });
    2 H3 `+ t4 S; H
      g' T) _2 E/ b0 ^7 k, t; h* B5 \                std::generate(vec2.begin(), vec2.end(), []() {, J4 z" n' Z* c9 V: n0 G; [8 W3 m
                            return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
    0 U! ~! W& Z# `: X                        });$ v( y" z; Z$ w4 A6 G0 ~6 s
    # v' v1 U2 H/ W* O" b0 P
                    for (size_t jj = 0; jj < vec1.size(); jj++)0 _3 Z3 Q- {3 b6 Z* o
                    {
    3 B. o/ t8 c& ?( z  E3 K                        b1[jj] = vec1[jj];( X& g6 t" y# B4 i, g
                    }
      G8 e8 N" T" @4 }9 @7 f4 p* C$ A7 Z5 M
                    for (size_t jj = 0; jj < vec2.size(); jj++)8 a6 m% V( |% s# n% y0 a  H
                    {
    ! i7 `) l: [: U9 }* C( s- l7 R6 f                        b2[jj] = vec2[jj];" r! M$ Q/ e, {/ a: q
                    }7 M! C; V1 r1 `3 s4 _9 f; `
    ' c7 v5 E: M) R
                    //Method - 1  N=100000 247s  " U; f# D- Z% V9 T, L+ y$ N) E7 J
                    //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
    . i! E4 m& o- P  N7 Z' F                                
    & u" G1 ?$ v$ p                //Method - 2  N=100000  237s: }! T/ ]% d4 Q' S
                    /*
    * R' e) Y, Z* C: y+ u; `                for (int jj = 0; jj < N ; jj++)4 \* C- @! X# q8 L
                    {
    . H% w$ A$ M! n$ b' Z& Z                        fresult += vec1[jj] * vec2[jj];$ U& i3 N! P% K
                    }
    + ?6 w1 f) H' m                */
    / s, l, e: R3 \" ?8 A                                - `7 {# O& t3 \+ ]/ l1 T
                    //Method - 3  N=100000 204s
    0 m3 p; e- b2 Z* d8 z                /*
    2 Y1 b+ x9 n* C( R2 B4 i6 ]                for (int jj = 0; jj < N; jj++)" B" O3 i* a! l% J# X5 u
                    {( l# c2 t1 Q% P' H  p
                            fresult += b1[jj] * b2[jj];  d# t* }4 P9 q
                    }
    6 U" ~0 y; d* a7 R" p0 T                */
    1 n; N* _& K6 m
    7 T3 N& P, I0 ~: c& I6 Y7 C                //Method - 4   202s
    # b' S6 h7 L: V* B                /*
    ) u5 P4 P9 Y$ M7 A" c  M  P! I3 g                for (int jj = 0; jj < N; jj++)
    ' `& c1 P( N  p+ f- e                {
    / d- S6 q% I! d                        6 J* H% t# L1 z  y0 r8 Z3 y9 g+ w
                    }
    2 X3 X4 H7 {) H& X                */4 ~2 U& q" t: O
                    //comment out all methods, N=100000  202s               
    . C6 E$ L! o& I: D" p- w        }) [- s6 M4 c# d2 n& h

    % W8 D5 W4 M* P0 p+ f  q2 \3 c        delete []b1;
    ' o& h3 T# w* @- ?, i        delete []b2;

    7 z1 ~" `: ^# ], R
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    16#
    发表于 2022-9-27 00:15:38 | 只看该作者
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?1 I; z) j! @. K: H  O  ?

    # g* K0 W; S& M* _/ J( A你第二个试验里面的j在循环里面又重新定义了啊,你确定真的跑了6000次?1 _, o" ~# N7 C3 R5 w
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    17#
     楼主| 发表于 2022-9-27 01:16:03 | 只看该作者
    机器猫 发表于 2022-9-27 00:15
    " N" ~# y/ i! J( B瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?( \& R  Q4 R+ x8 g0 g& h
    8 o4 O8 Z7 B! X2 o- B$ |
    你第二个试验里面的j在循环里面又重新定义 ...

    $ j% v6 O. L1 F6 a$ E/ g6 B  Q; J内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL7 N) t% V9 V; u( ]

    : g$ E1 f- d$ {- G不和它较劲了,瞎耽误工夫,我已经转到 ubuntu, 也准备顺便试试 avx2 向量化。
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    18#
    发表于 2022-9-27 02:06:58 | 只看该作者
    雷达 发表于 2022-9-27 01:16! A( B3 @% h7 W
    内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL' P+ i2 F6 [+ I

    # \1 B4 V6 y9 L4 ^; p# s5 B不和它 ...
      E9 R6 t( H) Z1 ^
    4 x3 W2 d. R' R& p
    不过可以试试我说的register变量。前一个试验j是混在一堆其它变量里一起定义的,很有可能是在stack上,这样内存读写会更多,要是再碰上每次都需要加载cache就更慢了。: c4 k) _' |9 H# c7 t8 w# K
    后面一个是在循环那里定义的,说不定编译器就把它优化成register变量了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

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

    使用道具 举报

    该用户从未签到

    20#
    发表于 2022-9-27 20:29:50 | 只看该作者
    雷达 发表于 2022-9-24 23:54
    ( ^; k' N* O* D- v+ qvoid xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    $ C1 z. ]' \& b& m* W: w{
    4 B7 K6 T8 U8 k0 z% }+ ^" C' T' j        comp temp, xtimesy;

    3 ?- `2 J4 @3 q0 G这个code里面如果Openmp没有被注释掉的话,那么temp那个变量应该是定义在循环里面,否则线程之间会存在争夺写入那个temp的风险。
    1 v, m3 l7 ^7 S* ^' h3 F内层for循环如果没有内部操作的话,编译时应该被优化掉了,和你完全注册掉整个循环是一回事。可能你的编译设置没有打开优化?; o" L* }, |# |; F6 p, V7 c
    VS社区版没有问题,我工作用的就是社区版,设置正常的话不会比商业版差。以前游说头头用Intel Compiler,他说不想花钱,而且差不了多少,就一直用到现在。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2025-11-6 23:43 , Processed in 0.049345 second(s), 19 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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