设为首页收藏本站

爱吱声

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2022-9-24 22:54:26 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
    C++ 比 Octave 慢好多,怎么破?
    ) X( i( f* ^7 b) r# I, e) q- z: c1 ^2 C& {! _# V& ]
    自相关两层循环,内层循环涉及浮点数计算,试验了一下把内层循环内部全都 comment out 只留个壳子,  但空的内层循环本身就把速度拉下来了,看来问题并不在浮点计算。6 u0 c: O# Z1 }6 |: y* W2 }

    4 }7 m1 D4 [/ S速度优化问题真的很有意思啊。# g8 W, Q" [8 Z3 c1 Z

    - {" U1 o. M7 d: Y1 S3 v8 Y欢迎大家继续讨论

    评分

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

    查看全部评分

  • TA的每日心情

    昨天 19:30
  • 签到天数: 1931 天

    [LV.Master]无

    沙发
    发表于 2022-9-24 23:04:16 | 只看该作者
    拉下来?拉多少?! _! G7 ~' \" F" x6 d" r! W9 U4 a
    把代码贴上来看看?
      H6 C9 g2 \) ~7 w
    8 I# L" c8 a9 M8 l3 [+ r  Q难道分支预测不准破坏流水线执行?不该啊。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    板凳
    发表于 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的每日心情
    擦汗
    2024-12-25 23:22
  • 签到天数: 1182 天

    [LV.10]大乘

    5#
     楼主| 发表于 2022-9-24 23:54:10 | 只看该作者
    本帖最后由 雷达 于 2022-9-24 23:57 编辑 5 u  J' H; ]6 N$ Z; j7 B$ b! B1 @
    数值分析 发表于 2022-9-24 23:045 j5 b5 f, G7 ~0 e4 L. G
    拉下来?拉多少?! ]' N8 E2 M/ `; Q
    把代码贴上来看看?
    % K! P+ n4 i( M" `; F
    ' ~) J! W2 }2 _3 w* C1 Y
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    / r) e+ {! C3 v0 A5 O7 q; V* P* q- _{3 b. |7 @1 \) E# {
            comp temp, xtimesy;- Y3 S& b# q3 L& ^6 q1 M
            xtimesy.re = 0;' f0 n9 \! f9 k( a9 ?! T$ |0 R
            xtimesy.im = 0;
    + c2 s& |2 _2 ]( J; R$ S        int j0 = lenB - 1;
    9 S& S' g2 _8 V        int    i, j, i1, reali;+ B  Y. T' {" F+ R: v8 c6 I7 T% J
            if (lenA % 2 == 1)
    " y- k' m- S' h3 n; ?3 {) [                reali = lenA + 1;" e* T/ N- L3 C2 J
            else" N  v" R! \" y
                    reali = lenA;
    * G/ Z6 {5 J1 b9 T        reali /= 2;
    7 r; `% e" p# Y9 x3 O; h( Y  u- ?% K5 y! {3 c, b" D
            int nconv = reali + lenB;, b0 d2 k; A% z! ^6 |. i5 `/ T
            //#pragma omp parallel for
    6 v5 o3 u$ e' A" \! H        for (i = reali; i < nconv; i++)
    6 \" U! J8 e: c2 M8 v        {/ m& {$ W1 ~4 Y
                    temp.re = 0;
    4 S- y$ l3 j' P" `                temp.im = 0;
    " M' z3 G$ G+ u& L8 i, a. N6 k                i1 = i;
    ' X, l5 P7 X/ U6 G8 p8 ?6 Q: Q; D                for (j = j0; j >= 0; j--)/ G: u) z2 Q+ n' Z1 U# u
                    {
    % K4 k' C, N8 r4 m! R, ~6 ?' Q                        /* floating date operation */$ g: |# R8 n- w; w" w9 v
                    }
    + o) f: m0 a# L* C
            }0 f' V, B  k  P
    }
    5 r& ^. C+ ?, K& V& Z
      v. Y$ p8 |- S$ p6 G3 m. _  ^xcorr函数代码如上,comp是复数struct, 做过长度为11、19两个矢量的测试,和octave结果完全一样! t. H, }! \1 P. U. h
    : v, n6 u) X8 a5 O
    红色部分是内循环,现在其内部操作都comment out 了, j0大概是 6000。
    0 c; W* ?' d* Y$ Z现在call xcorr 100次,耗时78s.
    / i, {6 P$ y6 o
    $ @2 s" b; a! m5 ?如果把红色部分内循环本身完全comment out, call xcorr 1000次,耗时 <1s.
    $ T- k5 y6 c8 _; i4 `# p1 [2 O" Z
    / P9 @& }, c3 e8 r; x
    回复 支持 反对

    使用道具 举报

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

    [LV.10]大乘

    6#
     楼主| 发表于 2022-9-25 00:17:17 | 只看该作者
    风雨无阻 发表于 2022-9-24 23:33
    9 F5 I* C# K. }" E& FMaybe Debug mode?

    * q9 X  |1 t3 f4 U. x
    " Z% z9 \6 }) z% q不应该,看我上面的回复。
    8 G* I, D/ s* g* d/ e  c7 Q; [1 W
    + O, W2 g5 G3 L9 T. a我更怀疑是 VS 社区版的问题
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

    昨天 19:30
  • 签到天数: 1931 天

    [LV.Master]无

    7#
    发表于 2022-9-25 00:20:10 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 00:24 编辑
    $ Q- ?2 }5 k, q) y- H
    雷达 发表于 2022-9-24 23:54$ Q7 S1 C: U2 G! g
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    , C$ |% [3 v  Y1 L9 o{
    6 m$ q- x# c: e        comp temp, xtimesy;

    # P: v  z6 m2 `& h' v
    . h" C% G7 \. ]+ L/ }& ]" w这个不是这么比的吧。。。& O2 W2 r- h" t* E" k9 `

    8 O' P2 P3 g: h% n* k9 w$ V% [您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。* ~% M& k" T/ m, d% m( p; @* O% K5 b! A) a
    : v  j8 N% a9 C6 [  g. \# k
    而加上内循环,光jmp和dec指令就至少多执行了6000个,慢个几十倍不是正常的么?
    回复 支持 反对

    使用道具 举报

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

    [LV.10]大乘

    8#
     楼主| 发表于 2022-9-25 00:46:56 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 01:09 编辑
    . S9 S$ [. X6 }2 z$ s& B( t% |
    数值分析 发表于 2022-9-25 00:20) Q+ b. m& R) d4 F2 G5 e0 G
    这个不是这么比的吧。。。4 |, Y- \% w! o( e
    ' U& G% W# H) ?, m2 A5 Y1 {$ H
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。

    # J. }1 W" T5 g7 n8 b: ?3 a, q& ]0 |( L! L6 x$ t$ a+ i
    有道理。
    7 G" f  ]. A+ p% _5 ~7 r& c5 q9 q' G所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,记得 numeric 库里有算向量内积的,我回头试试。# Q; v* e  J+ y' s' k4 \

    ) H" \1 Y# F, f! U7 q我先尝试尽量用标准库,一个小程序,不想搞得太复杂。多谢了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    9#
    发表于 2022-9-25 01:27:53 | 只看该作者
    雷达 发表于 2022-9-25 00:46
    ; Y* d  D3 \" U1 f9 W有道理。
    8 V4 G7 r) Z2 {, g7 N/ T; o所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,这大 ...
    ' n/ n' O: G+ N" S/ X
    你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子,把循环本身翻译成机器指令loop或dec/jnz,两者速度上会差很多) p2 @1 _, X3 p1 ~6 @+ H
    Why is the loop instruction slow? Couldn't Intel have implemented it efficiently?
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    10#
    发表于 2022-9-25 01:48:51 | 只看该作者
    数值分析 发表于 2022-9-25 00:20) @5 d% L+ l, x; M. V
    这个不是这么比的吧。。。
    ' O* ^  H) B2 _$ [$ ]0 m: |
    - T5 M8 B. Y" `$ V您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    而加上内循环,光jmp和dec指令就至少多执行了6000个
    + L* v: J5 E+ F* Z" v! E; R

    " M; d7 D7 ?' r4 ~( Q4 V, J+ g现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果循环这样跑,花不了多少时间。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

    昨天 19:30
  • 签到天数: 1931 天

    [LV.Master]无

    11#
    发表于 2022-9-25 02:06:44 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 02:16 编辑 2 b/ C2 h/ B! a
    沉宝 发表于 2022-9-25 01:48& I9 V' M2 F" M7 t$ k
    现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果 ...

    ! ~. w: V1 |4 U; Q- \' F& N$ f$ P
    ! F) e4 e, C0 e. Q$ {是的,兄台说的对。+ [' C" s# o# P4 k# ^- F- i

    $ ]+ w- }- l' r其实我想说的是 真正数值计算部分和代码中其他不直接计算的overhead的比值这个事儿。
    * ~+ Z: e, r. f% T# g
    5 C1 u  h7 Y1 M, C雷达兄构造测试用例的时候,屏蔽掉了所有计算的部分,使得剩下的都是overhead,这样run time比较的结果就显得好像不合理了。如果把计算加回去,计算部分的run time会dominate,结果就不那么离谱了。因为不好说,所以用指令数对比的方式试图直观地说明这一点。* e1 W+ ~. }. d) ?; Q5 |- t
      {4 h; a5 U- I) p2 q% M
    比如说,如果有计算,那么跑六千个循环相对于计算应该用不了多少时间。但是如果一边是什么都不做,另一边是六千个循环,那六千个循环比什么都不做慢几十倍了,就不是那么不合理了。
    4 G3 W% L6 v6 f1 |; H6 l; }& L6 Z  Y; Z0 N8 K# a! j3 W9 O% {
    当然也有可能像兄台说的,是优化参数的问题,但我觉得更多地是测试用例设计的不合理。
    回复 支持 反对

    使用道具 举报

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

    [LV.10]大乘

    12#
     楼主| 发表于 2022-9-25 04:47:43 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 04:49 编辑
    . i! k) _$ g' `. [
    沉宝 发表于 2022-9-25 01:27
    * M, q" C5 J( f+ Q) Z你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子 ...

    ) w1 U/ g6 X, Q% X) D% o+ J3 m1 r
    * o4 N1 S) F) Q& _- u又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差一倍,我上面这个差的太多了。  ]5 ~" F! P% S9 z- U5 a5 x
    0 ^* l" f" d4 s  B) W. Q4 ]
    我已经完全懵了。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    13#
    发表于 2022-9-25 05:51:23 | 只看该作者
    雷达 发表于 2022-9-25 04:47
    " ?1 u8 X/ V  L9 v. X( r又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...

    , F4 J) A7 Z9 Q+ F9 w6 o时间差一倍的结果可以接受。. J  Y8 V1 A, J2 s2 G" X! K3 i

    ) T& p' W1 F4 D, x, n2 g! r你还是用profile工具看看吧。现在大家都主观瞎猜。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

    昨天 19:30
  • 签到天数: 1931 天

    [LV.Master]无

    14#
    发表于 2022-9-25 14:58:59 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 15:38 编辑
    ; R$ r6 r- ?: c* F  C0 _( k8 Z
    雷达 发表于 2022-9-25 04:47! Z2 }' q1 b) G
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...
    / S3 H" f+ q5 |8 s$ Q+ @. I1 ?7 R3 ?' H
    5 e7 V1 E- q2 Y7 V; T
    / }9 V  S' c% G" f
    0 J4 p: n2 h/ l3 f4 X' b) \. l4 k1 T
    能不能把这个也贴上来,看看和上一个有什么不同?
    回复 支持 反对

    使用道具 举报

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

    [LV.10]大乘

    15#
     楼主| 发表于 2022-9-26 01:30:03 | 只看该作者
    本帖最后由 雷达 于 2022-9-27 01:17 编辑 ! |# H+ i, b5 }7 f. v1 O1 R1 f
    数值分析 发表于 2022-9-25 14:58
    . K2 I! H- e" ?能不能把这个也贴上来,看看和上一个有什么不同?

    - w% q/ Z: w. x2 ^7 b4 O, G& l# d  l理了理思路,重新做了一个测试。$ Y5 x& O1 }+ J+ x0 y/ n. S
    做了两个 vector 和 两个 float *, 都长 100000
    / m3 o, j4 Q* u! ~/ o9 }! N外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
      t( t2 i" u- @4 T0 J$ i; n, A% s# D3 d2 }
    内循环试了4种方法,
    / M* t/ }! u5 t. \1. 直接调用 vector inner_product 247s 8 H: j5 M  q2 \5 ]3 G
    2. vector 循环点乘累加 237s
    & b  O) U! S* @) d. y3. float * 循环点乘累加 204s/ u. J% s  z6 X4 B% O5 ?
    4. 空循环 100000 次 202s
    ; c9 Q# J" `% B& m' }, Z6 s3 B- L' [3 a( I) h7 r5 t, p! X( m
    不做内循环 200s
    4 J, X* |5 }& X! ^+ F% x$ k" R, Y8 P4 T7 g5 D
    你昨天说的对,内循环本身占比是很小的,大头在其他处理。* q5 o$ M( x( }* X/ I
    另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。" w/ e. k& ?* U4 S# _# b
    . T' D% U9 \" [9 z, _) `& x+ D
    至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)& ~5 O; E- P# l  A, r  N

    5 y! |0 Y  |; P2 |" \7 r1 q(为什么下面我贴的  b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成  jj 好了,原来 方括号里的 i 是斜体标志  LOL)" H4 Q; ^# U9 }
    . H- p: ?. y' {1 z
            std::vector < float > vec1(N);" d  ~; S9 j& Y) v
            std::vector < float > vec2(N);
    * J# P+ ?9 F$ H6 v7 H        float* b1 = new float[N];
    / _9 V( |' R0 N  E% B6 o4 C        float* b2 = new float[N];
    0 \* S0 a8 l/ u8 H5 J  Y* a( z0 S" B
    3 s$ Y' N' e$ _3 a. M( k4 ^1 j        for (int j = 0; j < 6000; j++)  a. J& c8 B9 O9 H" s
            {7 L# C, k7 I& @) n
                    std::generate(vec1.begin(), vec1.end(), []() {" ?, W4 z3 \3 Q4 W1 G  |
                            return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;) l3 g; P; R" c3 }
                            });2 g& R: W& C6 O% [9 X7 I

    6 U2 r) @+ l0 \8 n                std::generate(vec2.begin(), vec2.end(), []() {% A6 K) Y5 C) H4 V
                            return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
    5 X+ L, Q7 y4 t9 d! X                        });( K. l" I4 I3 z2 G$ t$ W' l1 L

    4 q# t5 I1 O4 W2 S( V; d% f                for (size_t jj = 0; jj < vec1.size(); jj++)5 L/ f- K; ^0 G
                    {
    2 Z2 @: M! `8 h7 I1 W6 f8 B                        b1[jj] = vec1[jj];' t5 A* [* m2 `. S2 X
                    }& Z0 i6 A' D$ s7 s% j% o8 M; M
    - `* l5 M8 M# R5 U9 W6 A
                    for (size_t jj = 0; jj < vec2.size(); jj++)- v/ A3 O, F( ]8 J1 B/ T
                    {1 `  K1 \$ M: g" Q3 u: Q4 ~# H+ e
                            b2[jj] = vec2[jj];. H) z" G# I& P) O9 `* ?
                    }/ a# ?2 F9 _, F+ _% x: }

    $ i2 n! F0 z- K& p1 d9 X) F' `                //Method - 1  N=100000 247s    A& J# K/ u, x4 s- J$ `/ h
                    //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
    $ F$ I0 B  m' q% s5 }5 B' t- ~! c                                # s% h7 p  x  R! d, {5 j+ U
                    //Method - 2  N=100000  237s
    $ g+ M1 L( k+ ~4 R                /*
    9 D0 W7 a$ |( q                for (int jj = 0; jj < N ; jj++)- _1 A/ n2 r# C1 W" f2 W
                    {0 D1 Y5 E4 s! D4 Z1 s
                            fresult += vec1[jj] * vec2[jj];
    9 v' A3 ]& v7 O( l9 j1 \                }: F& h# y# }8 H. T
                    */
    & y2 o& m* [( ]- p2 a; [! L                                
    * `% Y% R8 [0 X' K6 z# t$ C8 N5 F                //Method - 3  N=100000 204s0 j) y9 T. R5 i& P/ A, y+ p
                    /*1 [/ S1 U" E/ {/ S0 u
                    for (int jj = 0; jj < N; jj++)
    ! P* Z; G3 w( e; Z3 j2 j                {0 C- |0 a; V$ x7 o1 @2 Y* r
                            fresult += b1[jj] * b2[jj];5 o4 a" m7 U2 r0 @' s8 x9 D
                    }) p- ?+ b0 x  H3 Z/ e; e
                    */- I, Y! a3 Y: W4 Y* j
    , g! }+ t) q  s
                    //Method - 4   202s' S6 t* P7 l2 j4 {
                    /*
    - K0 K) E' v4 E3 j                for (int jj = 0; jj < N; jj++)
    8 ^  e6 ^9 }& h  g+ g+ j" b# C! W3 |                {9 {" g, z' ~  V" E
                            
    # c: G  f( @) T5 s                }
    + u4 b+ x# O9 `3 S                */" T. k9 `( u0 E* J
                    //comment out all methods, N=100000  202s               
    7 d/ n  U( ~/ l' V( p        }& B# _, f  q, K' n

    + \6 \1 a; W& H        delete []b1;+ j6 w/ E$ t* ?% N5 H& S2 u
            delete []b2;
    , e& l* G& e& b; E5 Y
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    16#
    发表于 2022-9-27 00:15:38 | 只看该作者
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?
    % z) H  g3 g* i- f/ v) `3 ]( x
    4 W4 A% V- `9 |" I* j你第二个试验里面的j在循环里面又重新定义了啊,你确定真的跑了6000次?
    " d5 x' l" \8 }
    回复 支持 反对

    使用道具 举报

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

    [LV.10]大乘

    17#
     楼主| 发表于 2022-9-27 01:16:03 | 只看该作者
    机器猫 发表于 2022-9-27 00:15
    % d) m' u4 n$ N  f瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?6 X0 y/ C( ?% z  v" `

    6 N* x0 @) z# g6 \* x/ i你第二个试验里面的j在循环里面又重新定义 ...

    - v/ Z0 ?9 V& J3 v内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL
    ' t+ K# F& ~# q4 I' h
    & g; D% Y0 N. @  M/ q% h不和它较劲了,瞎耽误工夫,我已经转到 ubuntu, 也准备顺便试试 avx2 向量化。
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    18#
    发表于 2022-9-27 02:06:58 | 只看该作者
    雷达 发表于 2022-9-27 01:16+ {6 [! Y: ]0 o! Q% @9 e2 [
    内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL1 d4 E* s0 G, N( `

    % d6 T' _% }# ~( D  q& I不和它 ...

    ) C# ~) F; V: K) J3 q5 f( {8 ~" c5 E1 F; S
    不过可以试试我说的register变量。前一个试验j是混在一堆其它变量里一起定义的,很有可能是在stack上,这样内存读写会更多,要是再碰上每次都需要加载cache就更慢了。6 _% f+ K+ b8 `' \; [: |
    后面一个是在循环那里定义的,说不定编译器就把它优化成register变量了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

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

    使用道具 举报

    该用户从未签到

    20#
    发表于 2022-9-27 20:29:50 | 只看该作者
    雷达 发表于 2022-9-24 23:54) R; K: o- i$ N9 \
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    0 \/ R, H* d" F9 v- ]6 e! z1 x  U; `{
    ) x+ e1 Y% a  k  ^& ]# [  `6 C* s6 v        comp temp, xtimesy;

      ~" c9 p" v  @这个code里面如果Openmp没有被注释掉的话,那么temp那个变量应该是定义在循环里面,否则线程之间会存在争夺写入那个temp的风险。5 i) F! c8 |4 h: R0 G9 _, K
    内层for循环如果没有内部操作的话,编译时应该被优化掉了,和你完全注册掉整个循环是一回事。可能你的编译设置没有打开优化?4 H. x" S, D6 f& z1 j! E' ]
    VS社区版没有问题,我工作用的就是社区版,设置正常的话不会比商业版差。以前游说头头用Intel Compiler,他说不想花钱,而且差不了多少,就一直用到现在。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2025-7-13 02:06 , Processed in 0.052235 second(s), 19 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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