设为首页收藏本站

爱吱声

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

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2022-9-24 22:54:26 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
    C++ 比 Octave 慢好多,怎么破?
    8 H) |* L9 \' Z7 u) B6 n+ O" ~& E$ b) ^- l' {7 r
    自相关两层循环,内层循环涉及浮点数计算,试验了一下把内层循环内部全都 comment out 只留个壳子,  但空的内层循环本身就把速度拉下来了,看来问题并不在浮点计算。$ `2 L8 ?/ p3 F4 L8 Q/ O; y. C% w
    : X3 K3 L$ ~3 l
    速度优化问题真的很有意思啊。5 ^% w/ n& D' X; f: O

    1 _( S; J8 Q- }3 y/ T欢迎大家继续讨论

    评分

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

    查看全部评分

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

    [LV.Master]无

    沙发
    发表于 2022-9-24 23:04:16 | 只看该作者
    拉下来?拉多少?* l6 _8 T$ _- T* G
    把代码贴上来看看?
    9 H( g" E. I5 R+ f& {9 p6 Z4 D' |. }% S1 A9 |6 ]
    难道分支预测不准破坏流水线执行?不该啊。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    板凳
    发表于 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 编辑
    5 c# k- F& W: `1 V* N- e' M
    数值分析 发表于 2022-9-24 23:046 \% z( i2 Y3 R8 a" Z# h
    拉下来?拉多少?; Y2 g+ S; D  F4 u+ }) j% o& M' a
    把代码贴上来看看?

    * j( p( T- a- K: b+ H3 @% Z6 v4 ?4 Y+ S+ Z7 N) u4 i
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    0 G; ]$ y9 Q6 z' ~$ k$ E% p{9 _" l( W- C4 O( f
            comp temp, xtimesy;
    : \; M3 {, f' a2 K        xtimesy.re = 0;# G( U- o9 {- M& p' l8 Z( x/ U' _
            xtimesy.im = 0;
    1 m2 p! U/ `! u1 Y% g6 x- {        int j0 = lenB - 1;& t: b) W6 Q  e3 y$ @, @; C
            int    i, j, i1, reali;
    $ p2 Z8 o% p/ ?9 N9 `. X/ w1 J4 ~4 Z        if (lenA % 2 == 1)
    * j( ?3 R0 l" F' }' f! F                reali = lenA + 1;
    : }/ L; g! Z1 a6 V9 ?; Q( p- R3 P        else
    " Q+ w4 n- B5 r8 n" m                reali = lenA;
    ( Q+ n  c: O: O# ~        reali /= 2;. w9 I, p  d& S4 t# V  Y! [) U& Q
    " _6 c  u& e' E/ O+ x
            int nconv = reali + lenB;
    9 w; w$ _$ `7 R: l  d9 A4 }        //#pragma omp parallel for
    + x8 U) L( }6 h$ t$ L- _8 p        for (i = reali; i < nconv; i++)  i8 F- E/ Q7 {$ }
            {
    ) _/ _8 `' R: z+ u                temp.re = 0;
    , p! r/ o# {* ]6 D1 J. L+ e& h                temp.im = 0;
    0 o: I4 z; X$ n, t! }" h6 u                i1 = i;
    1 }6 {- A: r' Y3 S                for (j = j0; j >= 0; j--)
    * d$ A) z7 R, s2 ^' J                {
    , a9 H. ~' V9 ^6 {) J                        /* floating date operation */) A" W0 E5 F/ a
                    }
    0 A1 q; h" X" t' q! Y% }. @  s0 A
            }
    4 x* y  d) n9 _, Y}; E1 I( R+ w( c3 A
    % j: }  g9 Q9 w
    xcorr函数代码如上,comp是复数struct, 做过长度为11、19两个矢量的测试,和octave结果完全一样
    . i( ~9 q2 l+ d* {( j4 s2 A# i; }- |8 u4 Z+ H" X, H) L! t: s' O4 h
    红色部分是内循环,现在其内部操作都comment out 了, j0大概是 6000。. |7 g  z" |1 s2 i
    现在call xcorr 100次,耗时78s.
    3 n9 A" e) i; J6 r  ^* c- s; `# l  `' y/ m
    如果把红色部分内循环本身完全comment out, call xcorr 1000次,耗时 <1s.
    % S& Q. q% t/ r4 o7 q1 }/ K- F7 A0 [2 A1 t
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    6#
     楼主| 发表于 2022-9-25 00:17:17 | 只看该作者
    风雨无阻 发表于 2022-9-24 23:33
    3 A, C5 d, h! x: T/ J, ]% LMaybe Debug mode?

    + H6 ]9 R+ `$ ^' Q
    + ?* B/ @' \8 ~3 Y- }! Z不应该,看我上面的回复。
    + v7 d4 c, k2 |  M7 c" H8 K6 Y: c: R  a2 r
    我更怀疑是 VS 社区版的问题
    回复 支持 反对

    使用道具 举报

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

    [LV.Master]无

    7#
    发表于 2022-9-25 00:20:10 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 00:24 编辑 ' u- F8 ?) n: a7 X" H1 _: B
    雷达 发表于 2022-9-24 23:54
    # q$ ?( a6 w9 q7 p5 dvoid xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)# n* X6 I, o) p8 `0 c
    {$ W$ T& t0 d" o: n+ X
            comp temp, xtimesy;
    5 I* ^' P+ d" M: t: x6 |. R8 A+ }

    7 |6 e9 G3 X0 A6 w6 t% u这个不是这么比的吧。。。
    + R" I6 Z! W  M  ^6 u- t8 [" X4 k  @- P
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    % n% F6 o1 D6 C% ]+ D* F( V5 m
    6 {- r9 t( V! k( f( S8 P- I而加上内循环,光jmp和dec指令就至少多执行了6000个,慢个几十倍不是正常的么?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    8#
     楼主| 发表于 2022-9-25 00:46:56 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 01:09 编辑 - b1 X% Y& f1 r; u8 h
    数值分析 发表于 2022-9-25 00:20. r1 F5 W) k/ E  `/ W; K, l
    这个不是这么比的吧。。。
    " w* l( I" q) q9 o& Q# ^. o$ \' f: P8 o2 {( ?
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    ) ]4 d! P5 d- G7 _, R4 K
      x$ }3 I" _1 I
    有道理。# G. Y# U: v! ?7 R8 X
    所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,记得 numeric 库里有算向量内积的,我回头试试。/ i" ?- r  y" K: M* a/ h( p: v

    . X! F- c3 y+ e1 o  a  I我先尝试尽量用标准库,一个小程序,不想搞得太复杂。多谢了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    9#
    发表于 2022-9-25 01:27:53 | 只看该作者
    雷达 发表于 2022-9-25 00:468 ^: P( a; [8 Z+ Q; @/ K/ g7 Q
    有道理。2 p5 E* s5 |! D; u2 L
    所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,这大 ...

    . }& i0 Q" \! ?) N2 M" a0 q你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子,把循环本身翻译成机器指令loop或dec/jnz,两者速度上会差很多
    ) x( c( j+ L0 m9 h7 WWhy is the loop instruction slow? Couldn't Intel have implemented it efficiently?
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    10#
    发表于 2022-9-25 01:48:51 | 只看该作者
    数值分析 发表于 2022-9-25 00:200 [0 F: {0 v6 j$ j. }* ~- V, k
    这个不是这么比的吧。。。) t) i( V' d! @6 g# m) F
    - l4 Y! u+ b. J" v& F4 B
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    而加上内循环,光jmp和dec指令就至少多执行了6000个
    3 _* Z  ?2 _: j9 c3 Y2 h( M

    & m( Z" j# s" q- Z' W$ W. c现在的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 编辑 ; c& ^9 z! O7 U# _7 ?! T. d; j3 C
    沉宝 发表于 2022-9-25 01:480 x9 O$ d+ a: E" J9 n
    现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果 ...

    ) V6 J6 S6 F$ W; |" v, A, ?  V, c
    # ?( M* [# j; A+ W4 `1 ^是的,兄台说的对。: g8 g/ b% `. [8 A- G
      i- K) q6 p  a) f! C5 l' U& W
    其实我想说的是 真正数值计算部分和代码中其他不直接计算的overhead的比值这个事儿。' t  x5 |% J- v% ~
    5 x1 c0 y5 @6 R7 x, Y  D; }
    雷达兄构造测试用例的时候,屏蔽掉了所有计算的部分,使得剩下的都是overhead,这样run time比较的结果就显得好像不合理了。如果把计算加回去,计算部分的run time会dominate,结果就不那么离谱了。因为不好说,所以用指令数对比的方式试图直观地说明这一点。$ q1 {. L) {" @; O
    & n: {! c% T  D
    比如说,如果有计算,那么跑六千个循环相对于计算应该用不了多少时间。但是如果一边是什么都不做,另一边是六千个循环,那六千个循环比什么都不做慢几十倍了,就不是那么不合理了。: Q5 u" n) Q3 X, Q  F, U
    - e. R/ ]' i( i' J
    当然也有可能像兄台说的,是优化参数的问题,但我觉得更多地是测试用例设计的不合理。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    12#
     楼主| 发表于 2022-9-25 04:47:43 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 04:49 编辑 5 {" j  U6 K+ E2 t4 O8 ?0 h6 i
    沉宝 发表于 2022-9-25 01:27/ e/ r4 @! B# P8 u+ T* ]: O* F
    你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子 ...

    9 f1 F$ w  I0 W
    2 B6 N5 n# e2 k) t又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差一倍,我上面这个差的太多了。2 a! c4 N& e9 k$ q, f  d; I

    ( ?6 c! m& j( s我已经完全懵了。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    13#
    发表于 2022-9-25 05:51:23 | 只看该作者
    雷达 发表于 2022-9-25 04:47. e6 O; S1 H: T  `3 D) {( @1 J8 W
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...
    6 U  s5 L9 N1 l$ s( N
    时间差一倍的结果可以接受。
    5 }; M7 ]* H1 {! N  S2 K$ @" o1 h$ U, M. d- B
    你还是用profile工具看看吧。现在大家都主观瞎猜。
    回复 支持 反对

    使用道具 举报

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

    [LV.Master]无

    14#
    发表于 2022-9-25 14:58:59 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 15:38 编辑 . ]" {4 s* i, }4 M) d. A
    雷达 发表于 2022-9-25 04:47
      \* N6 A& D9 `- ^又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...

    # ]( h' l1 U3 y* \+ n0 Z4 }: w
    0 W$ K; n4 I7 H, g, U' h8 d  }2 ]# v! M
    ( m* i$ N' C* }* ~) Z' A! @
    能不能把这个也贴上来,看看和上一个有什么不同?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    15#
     楼主| 发表于 2022-9-26 01:30:03 | 只看该作者
    本帖最后由 雷达 于 2022-9-27 01:17 编辑 ) V/ U1 y* V, I, M" H/ {# `% ?$ C
    数值分析 发表于 2022-9-25 14:580 r1 h$ E3 C! y5 H% i6 K9 [
    能不能把这个也贴上来,看看和上一个有什么不同?

      c' V7 ~4 w- T" q7 h& O$ M: q. J理了理思路,重新做了一个测试。
    ! k4 J) O+ Z2 l( }. ]; I& D做了两个 vector 和 两个 float *, 都长 100000
    # L, e& s$ ]1 ]; H/ F: ]外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.9 I, V: Y5 S5 [

      ~1 E! k  {9 S内循环试了4种方法,
    ' s" S7 X* ?% {$ U2 z9 O3 q1. 直接调用 vector inner_product 247s
    $ X. Q) [' b  R# g% f7 d+ {& N7 R/ G2. vector 循环点乘累加 237s
    5 O; z' G( j  r: C+ m3. float * 循环点乘累加 204s
      [1 o  t8 [% x+ }4. 空循环 100000 次 202s
    $ g" |" {  `4 f7 j; i. L
    " I9 ^5 G& e7 B5 @1 N7 r# \不做内循环 200s
    ! S; c1 d  i1 q& B8 \9 ]3 T) J8 C0 G' b9 U$ g( N3 q' Y7 z
    你昨天说的对,内循环本身占比是很小的,大头在其他处理。
    5 j  P! q9 |1 Z8 y; B# q另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
    ! K* m0 f1 l" X. q& o1 g5 v" K/ j$ b, y
    至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
    * w& M3 \& Y+ F1 r; T* s5 F" V+ Z+ b3 F' n: y. z# g6 [0 }
    (为什么下面我贴的  b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成  jj 好了,原来 方括号里的 i 是斜体标志  LOL)
    ; U/ }$ K8 M9 d- G( S
    / X+ }9 W4 h% m2 z9 @2 Y' i
            std::vector < float > vec1(N);# h" C) N: F9 A5 ?; O/ {  D$ n
            std::vector < float > vec2(N);
    2 n5 S& J6 I+ ]* M7 Y        float* b1 = new float[N];
    - x; \  R* Y6 v5 c# y* L( J        float* b2 = new float[N];
    * s) v% P( ^2 A3 D
    ; P5 Q$ Z' Q# T9 c        for (int j = 0; j < 6000; j++)
    4 D2 I* d% I% {+ \% I        {
    4 s" c3 V7 }. C# {8 {                std::generate(vec1.begin(), vec1.end(), []() {
    , D* v5 d6 X+ L2 h  m9 M" T                        return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;  X; `4 n$ w% B5 Z
                            });$ \5 W; W7 @9 I0 I4 D
    5 r! @: h& C4 [) z8 w( K
                    std::generate(vec2.begin(), vec2.end(), []() {
    9 T% q$ w! U& f0 ?! d9 P) s                        return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
    & m% @0 n: K* k  ^                        });
    5 M) a& a6 _1 D& f9 _0 w+ F! a$ O, w6 p. l+ [& o4 f
                    for (size_t jj = 0; jj < vec1.size(); jj++)
    9 Z( p& n) |7 z' H                {
    # i# U( [& E9 t                        b1[jj] = vec1[jj];
    4 _! I- p% \" E7 X6 r4 E                }
    : r: R+ Z+ G! V" Y* i* e- k! M) K8 f
                    for (size_t jj = 0; jj < vec2.size(); jj++)6 T6 Z1 z! S( N# U
                    {
    ' u7 w4 f; H& }4 v" T. O! p5 J                        b2[jj] = vec2[jj];) o1 X6 d4 b6 G' w1 c3 d
                    }
    + U$ a& a& F& N/ d8 x
    % T# I5 M* Q! T9 b* C7 H) p                //Method - 1  N=100000 247s  
    ' c7 ]% m7 V7 ^, ~  `                //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
    " h  V/ s# l  l! i                                4 T5 D1 C- H$ V7 i* e' T
                    //Method - 2  N=100000  237s- s0 ?; _( B: }- v5 M, ]6 C
                    /*4 i% I( g# z+ i3 D0 w
                    for (int jj = 0; jj < N ; jj++): L# I' ?$ ^- K  s
                    {7 W9 X6 I8 O' \
                            fresult += vec1[jj] * vec2[jj];, \3 {7 l1 Y9 w! c" l( {
                    }& D+ b( R) U3 d+ o% ?& K
                    */
    . {/ R2 k- C1 @( b  |* F                                . {6 L5 n, Y- j
                    //Method - 3  N=100000 204s# [# F! t6 Y; V9 [. C
                    /*
    ; v9 F) [' W4 n1 d4 y$ d                for (int jj = 0; jj < N; jj++)
    2 H6 m6 T# ~5 b                {
    % Y) s- v1 d% o                        fresult += b1[jj] * b2[jj];* d5 p( N' V) S2 ]  z
                    }7 C5 C' O6 N8 _/ A
                    */
    8 w4 X* d1 t4 S, D5 |5 A
    - {6 [% U/ }8 M$ a% _/ U                //Method - 4   202s
    $ D7 Z# n: c1 b- ~; Y  U3 z( D                /*
    8 ?1 ?, {+ L! r$ ?4 d                for (int jj = 0; jj < N; jj++)
    : H, q6 \7 F; E, d5 x9 e0 }                {
    # s; V# a: p4 m" h                        
    ' v" I- q; l/ ~' x8 y                }
    2 d- c% _# [! @" h- U5 i                */
    1 }9 E0 d( Q% H( I6 }& T6 Q                //comment out all methods, N=100000  202s               
    0 O* d9 P  ^; q; }  Z- B/ l- P5 p        }) J& a& X$ D- a
    4 p, A1 m5 Q' A' u: H  J, t
            delete []b1;
    - F4 p5 X( x7 l6 X        delete []b2;

    * _2 h6 P. B$ J- ^% U
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    16#
    发表于 2022-9-27 00:15:38 | 只看该作者
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?& Y1 M6 H5 T3 {4 I2 d" ]4 K

    + J$ g" H! n5 f$ S- h% c5 B你第二个试验里面的j在循环里面又重新定义了啊,你确定真的跑了6000次?
    1 z8 W- l7 M5 v* x& t. _8 V
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    17#
     楼主| 发表于 2022-9-27 01:16:03 | 只看该作者
    机器猫 发表于 2022-9-27 00:15
    0 _* u, `4 Z0 i3 U* R( f. C7 o瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?
    ( F: g6 U  f- k0 u; ?# F( t# i# T8 F
    你第二个试验里面的j在循环里面又重新定义 ...
    6 F! n" `, u  E1 q- W$ o0 X1 T
    内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL
    ! x* r8 h( C. b9 ^5 I# t5 A6 N* j4 n$ J
    不和它较劲了,瞎耽误工夫,我已经转到 ubuntu, 也准备顺便试试 avx2 向量化。
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    18#
    发表于 2022-9-27 02:06:58 | 只看该作者
    雷达 发表于 2022-9-27 01:16" ?8 i* l" t  ^; _2 A3 e
    内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL
    5 ~+ x, y2 J1 m5 G' C
    , y( h( j- D$ n" E, y# z) c不和它 ...

    $ V  e5 T3 ]  f- H6 D2 ]2 I+ R/ w8 B3 }, Y( y) {  j
    不过可以试试我说的register变量。前一个试验j是混在一堆其它变量里一起定义的,很有可能是在stack上,这样内存读写会更多,要是再碰上每次都需要加载cache就更慢了。/ v. E$ P0 L5 p: {$ K
    后面一个是在循环那里定义的,说不定编译器就把它优化成register变量了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

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

    使用道具 举报

    该用户从未签到

    20#
    发表于 2022-9-27 20:29:50 | 只看该作者
    雷达 发表于 2022-9-24 23:542 R" w' S& `6 r) t4 _- W# _
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)2 [9 d  q+ `1 G; y) U5 |. v
    {
    8 a& J0 g/ j8 e9 r5 m        comp temp, xtimesy;
    : O( z7 [& }* C/ Q
    这个code里面如果Openmp没有被注释掉的话,那么temp那个变量应该是定义在循环里面,否则线程之间会存在争夺写入那个temp的风险。, x2 o. j2 k  b' L+ p) Q# E
    内层for循环如果没有内部操作的话,编译时应该被优化掉了,和你完全注册掉整个循环是一回事。可能你的编译设置没有打开优化?* E: h% G& N, A
    VS社区版没有问题,我工作用的就是社区版,设置正常的话不会比商业版差。以前游说头头用Intel Compiler,他说不想花钱,而且差不了多少,就一直用到现在。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2026-9-18 03:04 , Processed in 0.073162 second(s), 19 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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