设为首页收藏本站

爱吱声

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

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2022-9-24 22:54:26 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
    C++ 比 Octave 慢好多,怎么破?
    ; x4 @* z5 |4 ]2 b9 p1 t
    ! Z* ?& a7 `% ^/ Y3 }自相关两层循环,内层循环涉及浮点数计算,试验了一下把内层循环内部全都 comment out 只留个壳子,  但空的内层循环本身就把速度拉下来了,看来问题并不在浮点计算。+ Q& v, c$ `6 ]( v0 p
    + d% j5 X% p) W  ]# y0 Z/ G7 n3 C
    速度优化问题真的很有意思啊。- u0 f- ]6 |% y$ |+ _$ ]

    4 y* K9 E* J6 G6 c' d9 |欢迎大家继续讨论

    评分

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

    查看全部评分

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

    [LV.Master]无

    沙发
    发表于 2022-9-24 23:04:16 | 只看该作者
    拉下来?拉多少?
    " _0 a9 B. e; W把代码贴上来看看?  b2 [) Y  `: }6 b9 b

    0 [- }7 X8 O! [0 c3 B! L# D& b难道分支预测不准破坏流水线执行?不该啊。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    板凳
    发表于 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 编辑
    $ p) W: Q6 x. E& l0 s: z9 N4 W/ _; Z
    数值分析 发表于 2022-9-24 23:04
    1 `+ `6 G6 z7 a+ e7 C1 m& _拉下来?拉多少?
    . v8 ]  Y% O" G! P3 D% ^8 N! o% l把代码贴上来看看?

    - N) Z/ C* y# p
    $ o8 ^% A/ s, C. v* `void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    % t4 s: F! c$ L& j/ n5 p* d{5 R0 c0 I& z1 c. T  s" @, p7 k
            comp temp, xtimesy;
    0 Y4 @. D7 ]6 l) }        xtimesy.re = 0;
    ! W+ I: P- ~# l7 S/ O4 w        xtimesy.im = 0;
    + i1 ^8 d( P5 v  h' e        int j0 = lenB - 1;
      e4 A+ o# X1 y* q9 C        int    i, j, i1, reali;0 K# k& C' e3 g, t6 r
            if (lenA % 2 == 1)
    4 _/ M+ X% X4 b7 L                reali = lenA + 1;; a+ g/ P% M0 i" B) C' m
            else
    * ?$ U$ `# k8 q  a& y9 K1 o# V                reali = lenA;: b% C* u6 Z7 c7 ]" Y: n5 i
            reali /= 2;
    2 N, [5 L7 k- v  L1 J5 U
    : O5 g( ?9 N8 v+ Y        int nconv = reali + lenB;5 q5 [; c, t4 l" C+ e
            //#pragma omp parallel for
    ' c, X% @7 j) R$ \! T/ H        for (i = reali; i < nconv; i++)  Z% j- w, G! k$ N# J
            {
    0 [, }  e  a2 B! i0 V                temp.re = 0;
    1 {  Y* D6 o7 }$ C: S                temp.im = 0;
    * g% h; Q. Z$ k5 i0 j                i1 = i;
    - v+ u$ q0 E# x# R                for (j = j0; j >= 0; j--)! M) f& u; K+ g+ }. T4 ^# P
                    {
    2 ~" }0 R! b( f' m6 P0 N                        /* floating date operation */
      k' @5 W) ^% x/ n) V6 a6 o3 i" e! f2 D                }

    0 E% K  t& f9 ]        }4 O. G( l/ ^* K6 E
    }
      |+ u$ e% P2 i/ F$ k; W7 K# ]* Y
    ' r- D  b" i# i& ]8 U% W) N) T/ ~xcorr函数代码如上,comp是复数struct, 做过长度为11、19两个矢量的测试,和octave结果完全一样
    ; X. n' M& |# O2 K2 C7 s: a- F# T
    红色部分是内循环,现在其内部操作都comment out 了, j0大概是 6000。; U2 u# H) f- f( k# k8 y8 R
    现在call xcorr 100次,耗时78s.1 ^6 g/ X0 q& e  P$ J% B
    # R8 T5 p: p1 G
    如果把红色部分内循环本身完全comment out, call xcorr 1000次,耗时 <1s. 3 v- `; Q' n% k: D) T* M
    ! o( g4 |$ T' g
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    6#
     楼主| 发表于 2022-9-25 00:17:17 | 只看该作者
    风雨无阻 发表于 2022-9-24 23:33& g4 Z% t9 y& x. U$ O+ d
    Maybe Debug mode?

      s3 {$ J7 O+ P8 Q( i; T. [, l4 [% t( ^, v6 N  D
    不应该,看我上面的回复。# j" {) A4 k3 }3 f  b9 f+ q4 G& i
    , _8 }. ^1 [: K8 {& T! A" i
    我更怀疑是 VS 社区版的问题
    回复 支持 反对

    使用道具 举报

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

    [LV.Master]无

    7#
    发表于 2022-9-25 00:20:10 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 00:24 编辑 # Y/ Z% S* V6 i, }+ O* z
    雷达 发表于 2022-9-24 23:54
    3 J5 V! C" U2 I: k# L9 W% N' o: Lvoid xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)) i3 `: J/ d  i) v9 v! @
    {: Q5 ?% w7 x# s5 B
            comp temp, xtimesy;
    7 G. Y# a1 {! }% z. y& ]

    % ~; c2 w- U7 |  I; t7 Q这个不是这么比的吧。。。; F; y+ t$ w0 d

    ( c3 T0 \# c3 J6 d3 n您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。* g& I+ t" n* n4 P, ?: U
    3 _( r* S/ U9 q1 C% f
    而加上内循环,光jmp和dec指令就至少多执行了6000个,慢个几十倍不是正常的么?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    8#
     楼主| 发表于 2022-9-25 00:46:56 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 01:09 编辑 + R) W" |" p: x* j
    数值分析 发表于 2022-9-25 00:20
    " d9 m  D. u+ {4 a4 n% b- e6 c8 A这个不是这么比的吧。。。
    ' |# O8 A$ o( |
    $ f: ?% R1 f4 H9 t您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    & g% p$ U8 x) j; ]: B( a: _9 _# z+ L
    , V" M1 A0 ]" b" z
    有道理。
    : U8 W) x  n5 k8 O4 I" X  O% c* E所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,记得 numeric 库里有算向量内积的,我回头试试。
    / U: x2 m: ]: k/ f; n
    6 H( Q! B  P" \/ N  K我先尝试尽量用标准库,一个小程序,不想搞得太复杂。多谢了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    9#
    发表于 2022-9-25 01:27:53 | 只看该作者
    雷达 发表于 2022-9-25 00:46
    : @3 V5 I  z" `& m- x有道理。$ i/ {7 T5 {4 L+ x3 n
    所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,这大 ...
    * E. z# j' S8 D& [- z
    你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子,把循环本身翻译成机器指令loop或dec/jnz,两者速度上会差很多
    ( M: y7 h' L7 c8 K/ P, ~0 ZWhy is the loop instruction slow? Couldn't Intel have implemented it efficiently?
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    10#
    发表于 2022-9-25 01:48:51 | 只看该作者
    数值分析 发表于 2022-9-25 00:205 O6 J4 s) r# ^  [% P$ ~# J
    这个不是这么比的吧。。。3 t! p  ^- |' _+ Q

    " X) ^+ `# z! C' a7 A- _您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    而加上内循环,光jmp和dec指令就至少多执行了6000个

    " l6 ^" A. _+ x5 ~
    3 ?& W0 D( ~# k6 J  M. q5 e现在的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 编辑 ' t- ]( L# Y" e2 s, N& z* o- d
    沉宝 发表于 2022-9-25 01:48% N  ^7 |, H& ?* f
    现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果 ...
    , w, r- G# y0 ^3 ?/ C# I9 f& L9 I( X

    - S. }9 ?* D$ @7 t+ J是的,兄台说的对。  @  p: ^1 o2 ~/ f1 Y& v
    ; ^# K9 n  _: y7 I
    其实我想说的是 真正数值计算部分和代码中其他不直接计算的overhead的比值这个事儿。" T* N9 K8 w2 Z4 G- E4 w. ~

    " M" `7 P6 k( c( Z  m雷达兄构造测试用例的时候,屏蔽掉了所有计算的部分,使得剩下的都是overhead,这样run time比较的结果就显得好像不合理了。如果把计算加回去,计算部分的run time会dominate,结果就不那么离谱了。因为不好说,所以用指令数对比的方式试图直观地说明这一点。2 Z2 S+ i- j$ ^" A/ a0 t

    0 U) @( g- A  V- X比如说,如果有计算,那么跑六千个循环相对于计算应该用不了多少时间。但是如果一边是什么都不做,另一边是六千个循环,那六千个循环比什么都不做慢几十倍了,就不是那么不合理了。
    + a  g3 F/ |& p* D
    ! H( S) \, Z1 Q0 K3 M! L* T当然也有可能像兄台说的,是优化参数的问题,但我觉得更多地是测试用例设计的不合理。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    12#
     楼主| 发表于 2022-9-25 04:47:43 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 04:49 编辑 ) n7 n+ @$ G+ r4 T+ |; O$ {- t
    沉宝 发表于 2022-9-25 01:272 B8 |4 I' H6 r7 d, N
    你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子 ...

    8 u6 Y2 Y: P+ h$ E3 Y$ Q
    2 ~1 U" c5 D) x+ f# }) x6 J又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差一倍,我上面这个差的太多了。
    % }6 i. \5 E, G- h
    1 I0 I2 f( Q! r0 g9 [我已经完全懵了。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    13#
    发表于 2022-9-25 05:51:23 | 只看该作者
    雷达 发表于 2022-9-25 04:47
    7 r4 |$ [% v5 ?0 `0 Y9 t/ p- H8 ~又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...
    : _: Z/ R6 d7 b
    时间差一倍的结果可以接受。) e' x- k$ b% s9 ?4 z3 d; g
    * e' V+ E, Y+ C7 W
    你还是用profile工具看看吧。现在大家都主观瞎猜。
    回复 支持 反对

    使用道具 举报

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

    [LV.Master]无

    14#
    发表于 2022-9-25 14:58:59 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 15:38 编辑
    ; N( K4 h& _( {$ Q
    雷达 发表于 2022-9-25 04:47
      q( G6 a4 J) L( `; ^6 y+ M又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...
    - Z: X- r/ A$ y0 L1 Q. q  @" L

    # x7 m& x/ e8 ^2 S$ F2 V3 `0 |+ a( E. B8 A# Q- C+ O5 W

    7 Z. s& p1 k4 [能不能把这个也贴上来,看看和上一个有什么不同?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    15#
     楼主| 发表于 2022-9-26 01:30:03 | 只看该作者
    本帖最后由 雷达 于 2022-9-27 01:17 编辑
    ( f  N- `$ X/ ~& [. r5 U
    数值分析 发表于 2022-9-25 14:58
    , X0 \1 M6 G; W- p7 ~  g能不能把这个也贴上来,看看和上一个有什么不同?
    ; V1 ]2 X8 B, W! W1 D# p+ F
    理了理思路,重新做了一个测试。
    - ]; g- `- d' M# P1 M做了两个 vector 和 两个 float *, 都长 100000
    % r  g& o/ b" W! z外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
    3 Z6 o" U2 c2 _/ Y2 U6 k$ x) _" c. B' P' A" s: w5 a; G2 {& @3 u: C
    内循环试了4种方法,
    " Z3 c) ]; i6 l1 j1. 直接调用 vector inner_product 247s 2 r+ i$ f9 e" b/ Q0 V: f
    2. vector 循环点乘累加 237s
    5 ?# U8 B8 Y1 ?: b# z3. float * 循环点乘累加 204s1 b' [& s  M5 ?3 V
    4. 空循环 100000 次 202s' Y9 }* b# w, Z8 K# Y: ^. M

    ) y. }2 j2 A& w1 e9 X0 O不做内循环 200s
    2 c; D! {7 D- x( q( {; U- }5 g+ s4 c' n9 l) `/ \
    你昨天说的对,内循环本身占比是很小的,大头在其他处理。4 y0 f/ p8 v! P4 Q% s4 w2 N7 {
    另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
    # m" q" g- W- M" a2 F- k6 l7 ~& d. z7 N5 r
    至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
    : o9 U7 B4 J  n; E1 n' h8 Z" [7 v2 S7 `: a
    (为什么下面我贴的  b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成  jj 好了,原来 方括号里的 i 是斜体标志  LOL)/ W1 p$ O, I& V; c; r7 S

    2 r, R$ v9 ?. k7 Z; C# w+ e
            std::vector < float > vec1(N);
    1 H  A! C+ S* r% B  q        std::vector < float > vec2(N);
    : o9 r: n* f: [        float* b1 = new float[N];
    ' W. o" ^* ]; t        float* b2 = new float[N];
    , b* ]' m0 R+ k! _& x2 {
    7 s, F8 X& f+ q        for (int j = 0; j < 6000; j++)
    : R3 {, g" m1 Y3 h% h        {1 J; a6 A+ @9 v6 h
                    std::generate(vec1.begin(), vec1.end(), []() {, u7 t% l& f, y# m) J8 N/ s0 l5 \
                            return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;( M' {! D- E1 D  F/ D; A4 e/ N
                            });
    # L. U# c8 C6 M& |2 E0 C& W+ o$ t% _) H$ R
                    std::generate(vec2.begin(), vec2.end(), []() {
    $ B1 `; ~8 f+ s9 `7 y                        return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
    ' ]  b5 O( D0 T& ~; w0 M  O; H                        });
    , B. s! |7 |1 I0 J. ]7 \. z, ~
                    for (size_t jj = 0; jj < vec1.size(); jj++)
    " W3 W- R# G# K3 n2 j2 D; d                {2 @' o8 Y8 n6 [3 [" O1 v( \# h& K
                            b1[jj] = vec1[jj];* H8 M% U2 I$ ~# R7 g
                    }% B7 g1 i" U5 O3 V: [! f
    ; g) g3 V2 s0 M8 I
                    for (size_t jj = 0; jj < vec2.size(); jj++)4 H2 F/ x5 }- u8 |" x# s
                    {
    , U" E' v  g6 o8 b6 Z4 y* r                        b2[jj] = vec2[jj];
    % W7 ?8 i$ |) r; T5 ^                }
    5 u; p6 H, ^% t) V. h$ w3 G' ^' s8 U8 c/ H# d
                    //Method - 1  N=100000 247s  
    % n7 w1 R* @0 ]8 u2 ]3 B                //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
    . x' Y6 l: ~+ @2 F                                
    ' q+ z, v; ]' @4 N. w                //Method - 2  N=100000  237s
    ) h2 Z9 u% ]( i+ M                /*
    / t0 _/ G" U# {( w/ s' @                for (int jj = 0; jj < N ; jj++)
      \  \5 ?1 }: {                {
    7 k4 e& ^2 t' F  z3 h* J: O                        fresult += vec1[jj] * vec2[jj];
    ; r- O1 `8 C& G7 Q) }                }  j3 S* |5 m" v& }3 `0 d1 h. K
                    */1 f; Q+ Y) Q) p# b# j, q6 L# I. E
                                    , ?* c' v& l  i! @' W+ K1 k' i
                    //Method - 3  N=100000 204s
    ' C5 K  s% Q, E( g% t/ B                /*
    . c4 s- N5 x1 b; x- z7 F                for (int jj = 0; jj < N; jj++)
    $ b5 T" q! ]0 ?+ o( A6 p1 f                {
      X3 Y2 ~! G: s2 P                        fresult += b1[jj] * b2[jj];
    # P5 I& j+ D: b7 n' U2 S& n0 F. _                }+ O3 p+ ^/ R' G/ m! x  Y2 y
                    */: x2 d8 d7 a( y. l+ `2 R
    + D% p: \* Z, Y% ^( I3 {. G
                    //Method - 4   202s
    * U3 }7 V# o) P# W) Q                /*
    / I1 B$ W# R# j. `                for (int jj = 0; jj < N; jj++)
    " m% x4 q4 n- M. D- ]                {
    , c4 ]5 r) i6 e0 y3 L6 ^) @                        7 W9 X1 s4 z2 V7 i+ m
                    }
    4 |( a8 _7 ~6 E6 Q) T                */
    : c! e# p$ m* r) {                //comment out all methods, N=100000  202s               
    1 m% U3 H" t( x+ e( I        }0 C# g" u% H  Z/ r/ D* l' t
    + D. F: ?8 v) O  |! d! h
            delete []b1;
    8 {: u) i6 `/ a        delete []b2;

    # ?! K2 q% ?/ v: P
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    16#
    发表于 2022-9-27 00:15:38 | 只看该作者
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?0 n9 g8 {! M2 G- }3 A9 q  Z

    + V* P* _( k6 t4 H+ I3 y" I2 ?6 L8 g你第二个试验里面的j在循环里面又重新定义了啊,你确定真的跑了6000次?0 v7 k% Z! b$ m4 G5 _0 s! A  `; K
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    17#
     楼主| 发表于 2022-9-27 01:16:03 | 只看该作者
    机器猫 发表于 2022-9-27 00:15
    $ z2 J% F8 C6 N瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?2 }3 c5 v* O$ ~! I( i# S5 X
    3 R; r2 I5 p" z3 l0 M. E
    你第二个试验里面的j在循环里面又重新定义 ...
      q3 r! N: Y0 G5 J: L& ^) U9 b0 G
    内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL
    / L" L0 y+ a6 s0 Y
    - b0 y) O; n  E# F3 j: l: U# Y' ]不和它较劲了,瞎耽误工夫,我已经转到 ubuntu, 也准备顺便试试 avx2 向量化。
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    18#
    发表于 2022-9-27 02:06:58 | 只看该作者
    雷达 发表于 2022-9-27 01:16
    5 s% H6 D. R* U内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL
    " r4 T; ], y8 u3 W- Y; Y) l0 J" s
    不和它 ...
    2 c6 L. q1 y2 W0 C, r+ k
    1 j# @0 Y2 j* R+ i
    不过可以试试我说的register变量。前一个试验j是混在一堆其它变量里一起定义的,很有可能是在stack上,这样内存读写会更多,要是再碰上每次都需要加载cache就更慢了。# j% M; ~3 \* O) I
    后面一个是在循环那里定义的,说不定编译器就把它优化成register变量了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

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

    使用道具 举报

    该用户从未签到

    20#
    发表于 2022-9-27 20:29:50 | 只看该作者
    雷达 发表于 2022-9-24 23:54
    2 T) R! Y& c/ E: x4 j1 kvoid xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    3 E! j+ B4 y* ?3 ^; e{
    + f) M; z7 }- g7 X        comp temp, xtimesy;
    ' _/ V! o; n7 ?  O, v4 U
    这个code里面如果Openmp没有被注释掉的话,那么temp那个变量应该是定义在循环里面,否则线程之间会存在争夺写入那个temp的风险。2 a5 ^; U+ V9 q$ M3 j" t% G  s
    内层for循环如果没有内部操作的话,编译时应该被优化掉了,和你完全注册掉整个循环是一回事。可能你的编译设置没有打开优化?
    & o9 l2 J9 P4 H8 h2 ^! z) N: P0 hVS社区版没有问题,我工作用的就是社区版,设置正常的话不会比商业版差。以前游说头头用Intel Compiler,他说不想花钱,而且差不了多少,就一直用到现在。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2026-8-26 23:17 , Processed in 0.067200 second(s), 19 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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