设为首页收藏本站

爱吱声

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

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2022-9-24 22:54:26 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
    C++ 比 Octave 慢好多,怎么破?0 D& ?3 i% [1 o1 A1 Z% `

    1 a  S# q' B3 ^6 C' g( b  `: N自相关两层循环,内层循环涉及浮点数计算,试验了一下把内层循环内部全都 comment out 只留个壳子,  但空的内层循环本身就把速度拉下来了,看来问题并不在浮点计算。, T! N1 X  x. C/ m" c
    8 x' z( j2 S6 |) `
    速度优化问题真的很有意思啊。
    4 h' T7 Y7 e+ a+ a* c: l; N' Y9 l% ]& p0 _: g; J* _
    欢迎大家继续讨论

    评分

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

    查看全部评分

  • TA的每日心情
    开心
    2026-2-7 02:13
  • 签到天数: 1955 天

    [LV.Master]无

    沙发
    发表于 2022-9-24 23:04:16 | 只看该作者
    拉下来?拉多少?
    5 A: H# K2 J4 n- ?5 l% q1 u% s" S, U& Q把代码贴上来看看?" ^8 Z+ \5 h; B' ~

    - R  Q$ k- H% ?8 U. U& p( C0 v, }难道分支预测不准破坏流水线执行?不该啊。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    板凳
    发表于 2022-9-24 23:15:41 | 只看该作者
    会不会代码本身的缺陷阻止了自动优化?另外,硬件配置和开发环境可能也有关系。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2026-2-24 07:04
  • 签到天数: 126 天

    [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 编辑
    " E' U, D- f0 m5 k$ ]6 n
    数值分析 发表于 2022-9-24 23:04, l3 _" `* K! s+ [2 K
    拉下来?拉多少?
    : |& ^& q. b+ c( s7 m; N把代码贴上来看看?

    8 N* E: \* a3 F* Y* y! k: z& j! G% b& e: o+ O& K
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)! E9 z: g+ B9 S5 F: @( ~! u. O
    {5 O1 \% y. L) d: n9 }
            comp temp, xtimesy;' e6 s1 S& E2 \2 n" B
            xtimesy.re = 0;
    6 S" i- [9 T1 U0 X. K; v! z        xtimesy.im = 0;3 U# c+ t8 H& Z9 a3 _  {( ?# i
            int j0 = lenB - 1;0 h6 X8 d" K( R' x2 |
            int    i, j, i1, reali;3 s2 N# m* }5 e2 q
            if (lenA % 2 == 1)9 c8 i; a  B$ k: J/ m; f
                    reali = lenA + 1;  W6 E4 }  [# a& c
            else
    / x) g8 ?3 k+ s0 e. e% V                reali = lenA;1 f) X* [8 u) a% K. z" p( ]* [. W! B
            reali /= 2;7 t- Y  B# A# I# D% c2 \

    ; X3 y8 B1 K8 E/ w1 W        int nconv = reali + lenB;
    ' U+ t( P1 N4 f5 f) [: j        //#pragma omp parallel for
    * q3 P6 K  k7 Z        for (i = reali; i < nconv; i++)
    9 t, f8 @9 m' w- M: e5 M4 Y$ m$ C" N5 U        {* s) r/ B  U: R# h: ?
                    temp.re = 0;, V$ S! c4 ]$ H5 w  D
                    temp.im = 0;' M! e# A' y) v  ?
                    i1 = i;: ]4 V: P& L6 O  w# K0 ^
                    for (j = j0; j >= 0; j--)
      p3 f+ M' ?0 Z( A                {
    $ G# `# F" P( S7 H3 A                        /* floating date operation */
    4 H1 q; p  |* O+ H; B7 H4 O                }

    0 @+ X% q$ ~: ^. b        }# }$ n0 O  d8 c4 N# ]
    }
    2 E6 A' `: H2 {  V9 G/ J
      D1 J1 i) N- |# z6 T6 M) Mxcorr函数代码如上,comp是复数struct, 做过长度为11、19两个矢量的测试,和octave结果完全一样7 w; w, {9 x; i- W

    % n# O, K" m7 c8 k红色部分是内循环,现在其内部操作都comment out 了, j0大概是 6000。, @0 r/ x: ~" L9 s
    现在call xcorr 100次,耗时78s.2 o9 N" {; A3 y- M- p3 w
    - r- S7 T$ a, J' B
    如果把红色部分内循环本身完全comment out, call xcorr 1000次,耗时 <1s. 1 e* H2 Y- O0 k6 e% r2 d( P
    ! T) L' J) d4 J. a* I. v
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    6#
     楼主| 发表于 2022-9-25 00:17:17 | 只看该作者
    风雨无阻 发表于 2022-9-24 23:332 H) N. E: Z. N  d5 r1 s
    Maybe Debug mode?

    ; V; |, y  l4 s# K- w  F2 m# z+ ]. [$ o6 z' Q2 {
    不应该,看我上面的回复。
    ! `9 h- G5 M# R0 r5 n  O' Z# q1 H( x5 w9 h
    我更怀疑是 VS 社区版的问题
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2026-2-7 02:13
  • 签到天数: 1955 天

    [LV.Master]无

    7#
    发表于 2022-9-25 00:20:10 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 00:24 编辑
    7 n. G8 h- s0 z0 U/ U
    雷达 发表于 2022-9-24 23:54* U  h0 x. z7 ?1 |
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    / R! R% O5 |8 Q1 x" i' ]{1 {6 ^- E$ U. W$ n' l: J, ?9 U
            comp temp, xtimesy;
    1 V( d7 `# W8 z8 F# _
    . U. n; W) \% y5 _
    这个不是这么比的吧。。。
    + L9 p- r1 n( C' q9 K2 p/ g- S- Q  _
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。! k; A- u7 T; i% Q

    " r: B+ B. L' w1 M) w' U而加上内循环,光jmp和dec指令就至少多执行了6000个,慢个几十倍不是正常的么?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    8#
     楼主| 发表于 2022-9-25 00:46:56 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 01:09 编辑
    / ?; q6 E& s) \% U5 c
    数值分析 发表于 2022-9-25 00:209 _/ t2 u# M# r% e- ]& b( C4 Z
    这个不是这么比的吧。。。/ S! I- S* l7 R2 c# _4 c) f
    , U, N. ?$ T; D: X
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。

    7 [3 `7 A! d9 G* L+ @3 ]+ Y4 a  m- G5 {7 X, V. j3 Z" m
    有道理。  H: V) U6 o! j
    所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,记得 numeric 库里有算向量内积的,我回头试试。
    ! ^9 W: l* s% p+ ?4 U# B$ A2 A0 C+ ]1 k' w; _7 z6 j8 E/ K
    我先尝试尽量用标准库,一个小程序,不想搞得太复杂。多谢了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    9#
    发表于 2022-9-25 01:27:53 | 只看该作者
    雷达 发表于 2022-9-25 00:46! _8 Q% z- ^! J/ ?8 P) A
    有道理。" T% |! k0 y3 L  g) K5 L
    所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,这大 ...

    ( y5 d6 p$ J$ u: h你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子,把循环本身翻译成机器指令loop或dec/jnz,两者速度上会差很多
    , F8 S: F# H! c; v7 G3 B; qWhy is the loop instruction slow? Couldn't Intel have implemented it efficiently?
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    10#
    发表于 2022-9-25 01:48:51 | 只看该作者
    数值分析 发表于 2022-9-25 00:20+ i% E% ^3 d% H% q; n
    这个不是这么比的吧。。。
    ( l) c( R  @$ c8 r3 D2 E# Q
    % E% X6 |8 o+ M: ]# Q您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    而加上内循环,光jmp和dec指令就至少多执行了6000个

    1 C0 C% V6 F0 S9 ]4 S1 ]" Y" w; m  C+ W+ T$ G- g* k5 J8 e9 F. m! z
    现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果循环这样跑,花不了多少时间。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2026-2-7 02:13
  • 签到天数: 1955 天

    [LV.Master]无

    11#
    发表于 2022-9-25 02:06:44 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 02:16 编辑
    1 W. l6 m2 _3 g" x; [/ K
    沉宝 发表于 2022-9-25 01:487 B- \4 s: S0 j! E
    现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果 ...
    9 }5 m8 T8 N8 \8 g0 T# i$ ?
    8 p/ v& z- ]9 p; ]
    是的,兄台说的对。) d! ^- f6 J; `0 m, _6 ~

    5 @: O! |6 _- Q其实我想说的是 真正数值计算部分和代码中其他不直接计算的overhead的比值这个事儿。  I! r+ ~/ o3 o2 i2 l7 Z
    & Y; R- Q9 K( |( c' N9 D& F
    雷达兄构造测试用例的时候,屏蔽掉了所有计算的部分,使得剩下的都是overhead,这样run time比较的结果就显得好像不合理了。如果把计算加回去,计算部分的run time会dominate,结果就不那么离谱了。因为不好说,所以用指令数对比的方式试图直观地说明这一点。
    4 v+ |! ^* f8 J. d; }  ^1 ]1 b# P
    + V' B$ u! S( u/ @9 S2 N比如说,如果有计算,那么跑六千个循环相对于计算应该用不了多少时间。但是如果一边是什么都不做,另一边是六千个循环,那六千个循环比什么都不做慢几十倍了,就不是那么不合理了。8 E  T2 K8 Y1 f' n" ?7 c% s
    7 r# [# }% i4 w# V- L' g
    当然也有可能像兄台说的,是优化参数的问题,但我觉得更多地是测试用例设计的不合理。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    12#
     楼主| 发表于 2022-9-25 04:47:43 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 04:49 编辑 8 V- P; P% @* Z4 D5 b
    沉宝 发表于 2022-9-25 01:27
    # E( d: G: D+ e% c2 X你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子 ...

    . L) f. G. m. i$ [* I
    4 ^; f: r" w$ g* c& U6 @) R4 K又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差一倍,我上面这个差的太多了。# K  K: {/ |9 T$ n

    % u0 B$ q5 H3 F- v. @我已经完全懵了。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

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

    . b+ S% F  B: L4 I9 N- J: z时间差一倍的结果可以接受。4 N4 }. B+ D, Q

    ! U+ V! v2 k1 T, _0 s- k你还是用profile工具看看吧。现在大家都主观瞎猜。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2026-2-7 02:13
  • 签到天数: 1955 天

    [LV.Master]无

    14#
    发表于 2022-9-25 14:58:59 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 15:38 编辑
    9 |9 N. P6 B0 q: ~4 U; ]
    雷达 发表于 2022-9-25 04:47' t. F: e; m) H$ X; B' T
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...

    4 Q5 R! t8 T# b' C+ l8 P$ u, J" r: y6 |* J" J0 n. a4 \/ k% B

    ' l& l! ?" `1 C9 Z' S; Y+ }! p- ?+ |0 S; Q& }
    能不能把这个也贴上来,看看和上一个有什么不同?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    15#
     楼主| 发表于 2022-9-26 01:30:03 | 只看该作者
    本帖最后由 雷达 于 2022-9-27 01:17 编辑 " _: A5 {. ~) a6 @+ [$ }  K
    数值分析 发表于 2022-9-25 14:589 G$ l3 h, Z, r- l" t
    能不能把这个也贴上来,看看和上一个有什么不同?

    5 C- g5 t. A, i& q理了理思路,重新做了一个测试。
      _3 S8 c3 s% x7 \) H做了两个 vector 和 两个 float *, 都长 100000
    * n2 @7 z0 T% c. m1 L外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.  A, m; J5 I/ Y! s/ _4 M9 ^
    . Z4 A0 k: p, F
    内循环试了4种方法,
    : G9 X$ H2 ?4 D1 v1. 直接调用 vector inner_product 247s
    : _( O; H- ~* d8 `2. vector 循环点乘累加 237s2 ~9 s! ~: l" I: y0 L( h/ b  L* h
    3. float * 循环点乘累加 204s# s0 G: ~( P) c8 L1 M) M/ N
    4. 空循环 100000 次 202s
    7 j$ X+ W. g. Q+ p, p
    . }$ i" p, t0 S: N9 B不做内循环 200s, \# h$ X2 K( {5 Y% |9 P

    6 k* X2 e4 Z. d8 N  o5 Y, n你昨天说的对,内循环本身占比是很小的,大头在其他处理。
    8 s( h) V' o2 _( S另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
    + Z$ e6 T$ @+ k# ]
    ( Z5 l3 O; t2 l4 o3 w3 O至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
    1 g" u- u# j# c* N( g9 ^/ ^# v; [' N4 V. `, A1 ]9 l
    (为什么下面我贴的  b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成  jj 好了,原来 方括号里的 i 是斜体标志  LOL)5 {* r: f! x: O4 [/ G8 V! z7 _8 s$ I+ g

    . ?, F. E) n8 `/ T) L8 I( i
            std::vector < float > vec1(N);5 x$ V. w" S0 D5 S4 A- V: H( s
            std::vector < float > vec2(N);
    : Y3 n+ ^6 U0 k) {* u+ V        float* b1 = new float[N];7 \5 ?5 b+ K4 E1 c' z. z" W/ P
            float* b2 = new float[N];) f/ U2 f: |' d5 w, f) U

    . n& M, c8 z0 u5 K) ~& C: W: l4 A8 \        for (int j = 0; j < 6000; j++)
    9 ~* ^9 @" x# q& e3 E3 T) p        {
    % N0 s5 K# q( x% q1 y7 ]# U6 Q0 R                std::generate(vec1.begin(), vec1.end(), []() {& w5 c& g1 B7 U2 o! b- m
                            return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;$ k$ i6 W; k5 `  i
                            });- x) H" o7 ?, t
    7 w& C+ f1 f) \" A5 p
                    std::generate(vec2.begin(), vec2.end(), []() {: ?7 D. B; |- N
                            return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
    3 D. r- b# l' L. y5 I                        });
    2 P$ t. p6 j4 ?9 u+ x7 y
    ( f* I& J7 v7 w3 `' l. z0 `1 W& e                for (size_t jj = 0; jj < vec1.size(); jj++)- [8 S% L# ]- a2 F' e1 U3 ^5 m! l& {
                    {
    % M1 j# o& L( r9 Y7 B                        b1[jj] = vec1[jj];
    + g3 b0 Z' e9 ]+ A                }
    " D( O  i- ^# k
    9 ]% v# p9 e  P. E9 u+ |: D$ |  q                for (size_t jj = 0; jj < vec2.size(); jj++)
    2 l# _( ~# S0 O$ w- X                {: U0 _5 Q$ N6 g: K
                            b2[jj] = vec2[jj];1 d! W- s: B- Z: N' M- d
                    }
    / L  m$ f8 [1 o1 V: o. f
    $ f( B$ Y/ H9 m                //Method - 1  N=100000 247s  ) X  a! n  q, i9 _. y
                    //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);1 U& J# {& h/ U) H' Q- j  C
                                    
    ) p4 Z. {7 T, s% I( F- r" U5 r                //Method - 2  N=100000  237s
    + l* k. p4 ~% g, a6 L& s                /*' K( k+ _( M0 V
                    for (int jj = 0; jj < N ; jj++)* `2 H, q$ W6 i% i  ]
                    {8 t3 G- j( Z% n2 y4 s& I
                            fresult += vec1[jj] * vec2[jj];
    + w; Q' e" P5 S* k% Z% F                }
    ( j: n2 s, R6 {3 A                */. q: r0 [6 Z- @8 ^3 u
                                    
    - p, \6 n* Y# B$ ~                //Method - 3  N=100000 204s1 H$ k( }) b# \3 n9 o& R/ B3 p% f
                    /*
    # q( J% k" s+ Z# z1 V* z) A                for (int jj = 0; jj < N; jj++)5 G* o, @; X# D; L" Y
                    {6 I* x% g0 P7 J% |8 A
                            fresult += b1[jj] * b2[jj];. G$ H' B  K- b8 J
                    }) \3 z3 ?: Y4 a+ t7 D
                    */* E" G  {) L+ i8 G7 Z; d
      E+ T' G/ a3 A4 d1 j$ g9 o
                    //Method - 4   202s
    % {) i( E1 y! g9 _  k: K                /*+ ]: @6 z1 l& d/ [
                    for (int jj = 0; jj < N; jj++)$ g! G! Y; s0 }" p, c: S! M
                    {3 |$ o# m# p9 M5 f, D4 I! I
                            
    " O5 B/ b$ H/ w' l$ J                }
    3 Z+ [9 ]/ U+ i9 o                */- K; T( x5 h( ^8 {
                    //comment out all methods, N=100000  202s               
    : }1 A, p& M) r9 q" K  a( D7 U. e        }
    1 O1 E& p' Z+ x( @2 y% N
    0 p# F* B. [1 j% I  X        delete []b1;! ?% q6 o- U/ ]
            delete []b2;
    * g; r6 i8 X) Q( a- n( o* q& m0 \
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    16#
    发表于 2022-9-27 00:15:38 | 只看该作者
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?" k+ O' p1 i& f# _* ]# D2 p) S3 h$ [

    . S8 T$ L1 d  Z( a# \你第二个试验里面的j在循环里面又重新定义了啊,你确定真的跑了6000次?
    2 S, L- H) M3 q; y. p/ n! n- M
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    17#
     楼主| 发表于 2022-9-27 01:16:03 | 只看该作者
    机器猫 发表于 2022-9-27 00:153 a8 N8 \9 @! P4 N
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?% b# a# B& x5 q. `9 k" Z

    ; ?: X9 u( o; K: R2 A9 ?你第二个试验里面的j在循环里面又重新定义 ...
    2 n/ `" b7 W. H0 O
    内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL
    * a7 v2 @' f" R# }/ S
    " e8 c' j8 z, @1 D4 c+ `% ~) M不和它较劲了,瞎耽误工夫,我已经转到 ubuntu, 也准备顺便试试 avx2 向量化。
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    18#
    发表于 2022-9-27 02:06:58 | 只看该作者
    雷达 发表于 2022-9-27 01:16% M5 k- K4 O' J% u0 ^* v8 ?  Z
    内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL
    9 C( |1 B: n6 `  O/ J4 w$ q4 L
    % d1 U, ~8 p" I$ A0 a2 S不和它 ...
    * a; @" h5 b) O/ _* A

      h. |, X3 J( K不过可以试试我说的register变量。前一个试验j是混在一堆其它变量里一起定义的,很有可能是在stack上,这样内存读写会更多,要是再碰上每次都需要加载cache就更慢了。, |* P4 X( `0 `
    后面一个是在循环那里定义的,说不定编译器就把它优化成register变量了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

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

    使用道具 举报

    该用户从未签到

    20#
    发表于 2022-9-27 20:29:50 | 只看该作者
    雷达 发表于 2022-9-24 23:54. a; R2 y( S! e2 M1 [- K4 F+ d- x
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)2 I/ f+ \7 R8 L8 D5 B6 N/ q; m
    {
    2 V6 R$ X/ h/ n- U        comp temp, xtimesy;
    / g  D7 R4 M% F+ G( V, K
    这个code里面如果Openmp没有被注释掉的话,那么temp那个变量应该是定义在循环里面,否则线程之间会存在争夺写入那个temp的风险。" Q4 Z1 \: g4 [; N7 k; Y
    内层for循环如果没有内部操作的话,编译时应该被优化掉了,和你完全注册掉整个循环是一回事。可能你的编译设置没有打开优化?
    " j  B/ i$ X; a" o% bVS社区版没有问题,我工作用的就是社区版,设置正常的话不会比商业版差。以前游说头头用Intel Compiler,他说不想花钱,而且差不了多少,就一直用到现在。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2026-5-17 20:09 , Processed in 0.076536 second(s), 19 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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