设为首页收藏本站

爱吱声

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2022-9-24 22:54:26 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
    C++ 比 Octave 慢好多,怎么破?+ J( L( {3 {7 u; ~
    2 o" g( s2 j( M( `
    自相关两层循环,内层循环涉及浮点数计算,试验了一下把内层循环内部全都 comment out 只留个壳子,  但空的内层循环本身就把速度拉下来了,看来问题并不在浮点计算。
    8 |  \" D) C, V
    , D0 R7 v& C6 Z) T" g# b1 \2 Q速度优化问题真的很有意思啊。
    - e$ d6 g4 G% C# Y5 U
    / }$ v8 @! F' |欢迎大家继续讨论

    评分

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

    查看全部评分

  • TA的每日心情
    开心
    5 天前
  • 签到天数: 1941 天

    [LV.Master]无

    沙发
    发表于 2022-9-24 23:04:16 | 只看该作者
    拉下来?拉多少?3 B2 ^3 s; p% b5 `7 `
    把代码贴上来看看?  i, ^& p4 f9 l! Z& r. H
    : B, |! Y4 Q! s' S! \* [
    难道分支预测不准破坏流水线执行?不该啊。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    板凳
    发表于 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 编辑 + a. }. O" B+ C) D: t& ?
    数值分析 发表于 2022-9-24 23:04
    $ n1 J  @0 h! u9 w拉下来?拉多少?) {6 o) {9 z" G$ d# a
    把代码贴上来看看?
    7 G/ ?& J3 Y& \: B. A8 f5 c
      ]" B0 C  T$ G' w8 J  N
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)1 M) w0 l% ]3 ?  f& Z
    {( o9 L3 |7 H- c" w9 c1 X. W
            comp temp, xtimesy;
    : c8 ~, P/ V# O, m' n) P& g3 z        xtimesy.re = 0;
    * ]* ~: ?( l. `% ~: [. Z  L/ R8 g        xtimesy.im = 0;
    9 X7 v0 u0 ~6 O3 J4 o* Q  C        int j0 = lenB - 1;1 L, Q! t! g* Z* t) F5 N# O. x7 q
            int    i, j, i1, reali;
    6 r* r: `* ~) G6 z        if (lenA % 2 == 1)
    7 X, X# i& c. |" f! u& D5 o                reali = lenA + 1;9 ]( K% n* x# m. x- ^
            else
    ! `! l, \' h8 h2 |0 d3 L. B* J( Y6 S                reali = lenA;
    1 x! m* ?0 W" S5 y# B: Y2 m* w        reali /= 2;" H. k. K& j0 Q# y7 y: q

    6 V+ _* ^8 a* ~: C5 n        int nconv = reali + lenB;4 E! u( z+ t; ?7 Z) I6 p! E- m9 `
            //#pragma omp parallel for
    + n: S* }( C( l0 n        for (i = reali; i < nconv; i++): j8 ?, m. V- F" E4 g
            {+ c) y$ O  }, ]) ?
                    temp.re = 0;/ g' l7 Z) i" X. b/ ?$ C
                    temp.im = 0;0 _; I# ?2 z7 `' h! |: {
                    i1 = i;$ S8 y$ q1 `% y4 |. h( ~# ?
                    for (j = j0; j >= 0; j--)
    # d) ?. ?% P5 i/ b1 ~' o                {
    % D) [! A' z: L. d; ?" H                        /* floating date operation */
    * s$ {& h$ h& i1 Z' q                }

    % J, |5 r: B; R* M. c        }
      R0 X, A3 ?3 E/ i}% E: X! X( l7 a

    ) l  F6 g# M. u$ ]! j: \xcorr函数代码如上,comp是复数struct, 做过长度为11、19两个矢量的测试,和octave结果完全一样6 N0 z, V0 M3 o$ E6 A( n

    * x5 x! `4 ?- O' }' v# T红色部分是内循环,现在其内部操作都comment out 了, j0大概是 6000。
    5 ?6 u- z7 V' q. Z现在call xcorr 100次,耗时78s.# G1 x) S8 H2 z! m  h$ M

    3 w: U5 |  M: M如果把红色部分内循环本身完全comment out, call xcorr 1000次,耗时 <1s. ) w0 r; X  A3 D4 R$ z) p# W$ H

    8 t1 F2 h4 u) L' ~1 l
    回复 支持 反对

    使用道具 举报

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

    [LV.10]大乘

    6#
     楼主| 发表于 2022-9-25 00:17:17 | 只看该作者
    风雨无阻 发表于 2022-9-24 23:33  _# X# z3 `1 b
    Maybe Debug mode?
    3 M0 }$ ?$ e, p
    ; k* p' }5 h& {/ o5 g; k3 @
    不应该,看我上面的回复。) D) K2 G3 I( j" ]/ T* m0 T0 W5 N% Y

    7 n3 a! [% y. z0 w6 J3 N- \我更怀疑是 VS 社区版的问题
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    5 天前
  • 签到天数: 1941 天

    [LV.Master]无

    7#
    发表于 2022-9-25 00:20:10 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 00:24 编辑 + G) f" M/ I/ H
    雷达 发表于 2022-9-24 23:54& I) s' d  O% K( r7 k4 B
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)0 x% p2 q1 z6 n5 \
    {
    7 L* S. a) x- Q' M% ]: E% E4 r        comp temp, xtimesy;
    8 p7 y, K' l, `: |0 A
    6 c; T4 t, \1 i, k9 v1 u( e/ {8 h
    这个不是这么比的吧。。。
    . K# k: l  o8 q- l4 ]$ N& K5 x: ^8 G7 \6 ]- z
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    & M/ q! t, {1 G! ^3 r
    ! j; b0 K: N1 x: w: y而加上内循环,光jmp和dec指令就至少多执行了6000个,慢个几十倍不是正常的么?
    回复 支持 反对

    使用道具 举报

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

    [LV.10]大乘

    8#
     楼主| 发表于 2022-9-25 00:46:56 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 01:09 编辑
    3 {  f- u1 ^) a; J( G9 A
    数值分析 发表于 2022-9-25 00:20
    % ]' K4 T4 {: m4 ^这个不是这么比的吧。。。
    & p+ v. y) [" l" C
    7 K6 T" u: a7 b9 U9 M- Z0 g# [您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。

    9 Y4 \# U1 c' h6 [: B6 ?! X6 }* l! T( K2 W6 A* Q2 d9 k+ }
    有道理。. H, V& a8 F' G! a
    所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,记得 numeric 库里有算向量内积的,我回头试试。6 U3 b2 F7 C& O' g! [+ D# v& Y
    0 o2 F9 L# l: Z
    我先尝试尽量用标准库,一个小程序,不想搞得太复杂。多谢了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    9#
    发表于 2022-9-25 01:27:53 | 只看该作者
    雷达 发表于 2022-9-25 00:46
    . O0 m8 w: Y7 n" I2 p有道理。
    , N+ k- J5 K. j1 B4 ^所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,这大 ...

    3 l* N; V: |& K- v你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子,把循环本身翻译成机器指令loop或dec/jnz,两者速度上会差很多! T4 e- S4 S5 P7 r
    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; u4 m1 D7 j) B  q+ q6 N7 U7 F
    这个不是这么比的吧。。。
    ' r/ {% k$ Q# Z  ]7 p- D) T, J1 b# O: L, j4 Q( B; w3 g
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    而加上内循环,光jmp和dec指令就至少多执行了6000个

    ! a' Q* f$ \1 \+ c! G# J8 w* {" d* u/ U4 d1 @6 G
    现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果循环这样跑,花不了多少时间。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    5 天前
  • 签到天数: 1941 天

    [LV.Master]无

    11#
    发表于 2022-9-25 02:06:44 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 02:16 编辑 9 f$ }+ c5 j5 ]# L+ h" J) C
    沉宝 发表于 2022-9-25 01:48; m1 I* J# ?1 u$ M3 _; e
    现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果 ...
    " r! ?8 Q" @8 ?& g" j: {' [6 R+ m6 c
    5 \+ B8 i' ~9 c
    是的,兄台说的对。( p6 t# I* j4 z5 `+ @

    4 ~; t4 ?9 U$ r, }其实我想说的是 真正数值计算部分和代码中其他不直接计算的overhead的比值这个事儿。& X  k9 o  W  t% d0 w
    7 U- B2 \1 b+ V5 J5 \
    雷达兄构造测试用例的时候,屏蔽掉了所有计算的部分,使得剩下的都是overhead,这样run time比较的结果就显得好像不合理了。如果把计算加回去,计算部分的run time会dominate,结果就不那么离谱了。因为不好说,所以用指令数对比的方式试图直观地说明这一点。4 t0 @; H3 P4 T! E# C# p
      x- |+ t! _; j3 l
    比如说,如果有计算,那么跑六千个循环相对于计算应该用不了多少时间。但是如果一边是什么都不做,另一边是六千个循环,那六千个循环比什么都不做慢几十倍了,就不是那么不合理了。
    ( C: M2 ~5 x5 [. ], |2 N
    # {4 r, k7 N6 x2 z+ U6 c$ ?! d当然也有可能像兄台说的,是优化参数的问题,但我觉得更多地是测试用例设计的不合理。
    回复 支持 反对

    使用道具 举报

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

    [LV.10]大乘

    12#
     楼主| 发表于 2022-9-25 04:47:43 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 04:49 编辑 ) ?0 x& Y6 L- |: I) T4 S" R  {( Z; @1 Q
    沉宝 发表于 2022-9-25 01:27
    / f) |' X8 ?! @* Y& |你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子 ...
    3 s- t/ j4 ?! \- h
    ( p! x# V* L( u0 L4 B: |+ d5 u
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差一倍,我上面这个差的太多了。
      c% v8 r, h% Q, j& H4 }$ Q) W
    / R8 v( n0 _3 U; ?我已经完全懵了。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    13#
    发表于 2022-9-25 05:51:23 | 只看该作者
    雷达 发表于 2022-9-25 04:47
      N! X3 v! F3 p- y- U又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...
    5 p4 J, @4 ?9 E
    时间差一倍的结果可以接受。1 G% S# v/ L  X, v* V+ D) e' j7 Q, }

    6 u: p$ k0 ]2 {你还是用profile工具看看吧。现在大家都主观瞎猜。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    5 天前
  • 签到天数: 1941 天

    [LV.Master]无

    14#
    发表于 2022-9-25 14:58:59 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 15:38 编辑
    ) E# w1 F& A/ _7 T2 `. |
    雷达 发表于 2022-9-25 04:47
    ) O5 y" ~( _% [* V. K9 t又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...

    + c& g- p) E8 C+ k
    & Z0 i0 W: X4 s) o  H, E; m; ^8 S* ^! l9 S& F0 ?1 G# f

    8 P3 a% z! x/ t9 h能不能把这个也贴上来,看看和上一个有什么不同?
    回复 支持 反对

    使用道具 举报

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

    [LV.10]大乘

    15#
     楼主| 发表于 2022-9-26 01:30:03 | 只看该作者
    本帖最后由 雷达 于 2022-9-27 01:17 编辑
    7 S# C! f4 v7 q( g
    数值分析 发表于 2022-9-25 14:58
    / Z. u' N; n4 o) q; D能不能把这个也贴上来,看看和上一个有什么不同?
    ) N8 p  n; }/ F
    理了理思路,重新做了一个测试。  Z: c/ }+ ~/ j
    做了两个 vector 和 两个 float *, 都长 100000
    % I) m' W' a0 v$ C外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
    ; B; N' I6 x$ Y; ?& b5 J* ?# u' R8 R- o6 ^% B
    内循环试了4种方法,
    8 l" A8 [* y9 E' l4 f8 T) E1. 直接调用 vector inner_product 247s
      }0 x2 I3 c3 ?9 {$ m* H2. vector 循环点乘累加 237s
    1 Q& d+ R; ^5 y2 M2 H: J. J+ w3. float * 循环点乘累加 204s! r8 W% n8 p1 i. p
    4. 空循环 100000 次 202s
    * u2 U! X5 a' u4 L
    & T  l4 G2 v5 H( k! b5 I不做内循环 200s* h! M3 Y; i- H8 K3 _7 A8 f
    : ?5 x7 Y" |: Z
    你昨天说的对,内循环本身占比是很小的,大头在其他处理。
    ( Q) a" s0 B- m: Y# R9 q0 O& X另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。2 W/ W) Q- m" w0 m
    . E3 J" b( o- R
    至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)  b0 |: o+ @  R# D( l% M/ b5 S  z

    % C% ^* J+ Q' z- y(为什么下面我贴的  b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成  jj 好了,原来 方括号里的 i 是斜体标志  LOL)
    # s+ \# S% x# N! ^
    / Q9 g  L; x: X! ~* E3 u, i* [+ C
            std::vector < float > vec1(N);
    2 P0 e, |1 I5 B+ l0 y& n; ?        std::vector < float > vec2(N);
    - d- L% w6 |8 ^4 ~: C        float* b1 = new float[N];9 U& h/ P) L' _
            float* b2 = new float[N];7 n5 A! L) W' `( ^: b
    9 @, U( V" D; r3 A$ N
            for (int j = 0; j < 6000; j++)
    4 C1 y! w0 t0 H        {
    2 H# B, l* v9 j8 \3 p5 G6 Z8 o* d+ I                std::generate(vec1.begin(), vec1.end(), []() {- C+ @! ~# i6 z; |- P& L& Z. i. n* C
                            return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
    * P+ f( [- [; `3 o; e2 s) }, |  H                        });
    0 P) D1 {; F) T9 z4 Z: Q5 \" i- H& L7 T: E& v
                    std::generate(vec2.begin(), vec2.end(), []() {" E% d! Z1 W- c  [" n. }$ E" I( m
                            return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;$ d' \- {: Z. ^0 s, X, `  G! c
                            });
    6 X. w5 p" i- O
    7 F8 t% ~- L9 t' n1 g2 S7 d                for (size_t jj = 0; jj < vec1.size(); jj++)4 `( H" x3 B. C! g0 K  Z
                    {
    , Q7 L0 @; j" \( w4 L) m0 a, P4 C+ |                        b1[jj] = vec1[jj];
    - B! y4 X7 b& w( m7 x                }1 N1 d: w1 R; F2 A) i
    ( \  E; i) n% n0 Q
                    for (size_t jj = 0; jj < vec2.size(); jj++)$ b1 K) E, `. `! \6 D2 d" V
                    {
    . G5 n8 U# a, }1 [                        b2[jj] = vec2[jj];
    : D5 l& J& K$ R. g                }0 B. F# C; ?  A) i

    * @' l6 q8 G5 `, u1 E" ^3 c                //Method - 1  N=100000 247s    U1 C6 N# j2 U. I7 b* R  V
                    //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);, f2 W5 ^6 H: v+ Y
                                    * K/ n" n4 ^3 y8 T. j: @: H
                    //Method - 2  N=100000  237s
    * A* ]& I' Y; I- z; A4 ^# K                /*6 Y( k$ m, S5 ?+ n( T, B( _; d$ L  M
                    for (int jj = 0; jj < N ; jj++)2 V# h* a  Q; t# |/ G3 X3 X
                    {
    . Q7 a# M, j: F& t0 F7 Z- W& f( ~1 t                        fresult += vec1[jj] * vec2[jj];
    : y% W8 t9 }/ ?1 U: W2 ^                }) x# Y& y8 Y3 ^; |
                    */
    0 d* S3 j- ], z  S, W3 D                                
    + L: n" g: W' p4 }/ ^                //Method - 3  N=100000 204s
    ( }/ @* a$ M9 r( c6 @                /*; \' m& X+ T' t/ h) Y4 d
                    for (int jj = 0; jj < N; jj++)
    : R4 L- m% x! K4 ]3 a9 g; }& O" F                {: a# |: T  x# H9 }% ^0 I; o
                            fresult += b1[jj] * b2[jj];" k; _  w) Q/ r, u
                    }
    6 }/ S' i1 C  x, A                */
    / a6 l6 C# @0 H+ s* |: a9 S0 c1 J, G% x7 h6 M
                    //Method - 4   202s
    & _& t: B! {# s/ f                /*
    $ H5 u9 @' J8 M3 E                for (int jj = 0; jj < N; jj++)# t# J+ r( H6 ~% w5 |2 ~6 v
                    {7 i6 ^. U( L$ k2 m, G- }  n
                            - C* k3 F& `0 H- o* `
                    }
    * K7 L0 z9 r- u. |* a                *// B* I; e" d- p$ P
                    //comment out all methods, N=100000  202s                $ }2 P; S4 I( v5 o4 n$ D
            }, E" M" S/ \; W1 Q

    8 i. A4 ^3 t" b; z* c6 d4 e' D        delete []b1;
    , ]' S4 W3 Q2 l* ~        delete []b2;
    : j' w/ M8 j) l% O) y
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    16#
    发表于 2022-9-27 00:15:38 | 只看该作者
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?
    7 U- b( N* C) [4 A! I: P9 z, ^* o" u
    你第二个试验里面的j在循环里面又重新定义了啊,你确定真的跑了6000次?/ K, b+ O/ j5 ~9 r0 j& p( y
    回复 支持 反对

    使用道具 举报

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

    [LV.10]大乘

    17#
     楼主| 发表于 2022-9-27 01:16:03 | 只看该作者
    机器猫 发表于 2022-9-27 00:156 M2 O* v7 F5 W: L* ^' A. t
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?
      m* F) C0 O$ a; [- f, V2 c+ f
    3 W+ R$ g: ?+ C! U你第二个试验里面的j在循环里面又重新定义 ...
    2 p6 q$ {7 J5 z/ @, S
    内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL" Y8 B1 C) d+ c9 M  Q
    : s/ T+ l) }8 Z' y+ g; d0 R. p
    不和它较劲了,瞎耽误工夫,我已经转到 ubuntu, 也准备顺便试试 avx2 向量化。
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    18#
    发表于 2022-9-27 02:06:58 | 只看该作者
    雷达 发表于 2022-9-27 01:16* w- _1 o& E) c- V
    内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL
    & E1 v) v! H4 x$ x
    2 ]8 A. {% O6 a) v不和它 ...
    ( l$ A! ^6 [* s% P0 O8 A
    7 ?2 ]6 x4 |1 N# D: R8 d/ h% `
    不过可以试试我说的register变量。前一个试验j是混在一堆其它变量里一起定义的,很有可能是在stack上,这样内存读写会更多,要是再碰上每次都需要加载cache就更慢了。
    . V, z) P% `8 F; U' R后面一个是在循环那里定义的,说不定编译器就把它优化成register变量了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

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

    使用道具 举报

    该用户从未签到

    20#
    发表于 2022-9-27 20:29:50 | 只看该作者
    雷达 发表于 2022-9-24 23:54% x6 L7 Z# D' Z' B$ j6 x  h
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    : X# |5 H: j4 ]+ i{  z& Z8 N, [( G+ H2 c( r- G) X
            comp temp, xtimesy;
    3 I# r) F& l$ u% E/ \) G) v
    这个code里面如果Openmp没有被注释掉的话,那么temp那个变量应该是定义在循环里面,否则线程之间会存在争夺写入那个temp的风险。
    4 [: J- m' P5 R* S3 ?; l; I内层for循环如果没有内部操作的话,编译时应该被优化掉了,和你完全注册掉整个循环是一回事。可能你的编译设置没有打开优化?% E2 w; T8 ~7 q6 C6 M/ M5 u
    VS社区版没有问题,我工作用的就是社区版,设置正常的话不会比商业版差。以前游说头头用Intel Compiler,他说不想花钱,而且差不了多少,就一直用到现在。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2025-9-17 22:11 , Processed in 0.058298 second(s), 19 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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