设为首页收藏本站

爱吱声

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

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2022-9-24 22:54:26 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
    C++ 比 Octave 慢好多,怎么破?
    - ]$ G, a# r6 b) \, r! E, Z# R) l1 r$ n: o
    自相关两层循环,内层循环涉及浮点数计算,试验了一下把内层循环内部全都 comment out 只留个壳子,  但空的内层循环本身就把速度拉下来了,看来问题并不在浮点计算。! B1 m8 ~0 z9 D" z
    : {5 x9 t- C  h: r1 p  s
    速度优化问题真的很有意思啊。
    ; `, a2 O) j# I+ E6 e
    ) s& G* x3 |7 Z2 J* T欢迎大家继续讨论

    评分

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

    查看全部评分

  • TA的每日心情
    开心
    2025-10-27 04:12
  • 签到天数: 1953 天

    [LV.Master]无

    沙发
    发表于 2022-9-24 23:04:16 | 只看该作者
    拉下来?拉多少?
    ; t" g, V, ?( z把代码贴上来看看?
    ' D. ~+ k) m  q
    . S0 [/ q/ j' q' N0 @) K难道分支预测不准破坏流水线执行?不该啊。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    板凳
    发表于 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的每日心情

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

    [LV.10]大乘

    5#
     楼主| 发表于 2022-9-24 23:54:10 | 只看该作者
    本帖最后由 雷达 于 2022-9-24 23:57 编辑 # J. Z8 s' v1 |! \: j2 K
    数值分析 发表于 2022-9-24 23:044 T2 {6 V4 V- s$ n' T6 P
    拉下来?拉多少?
    7 E/ K: C' n; X" ]0 p; z0 J3 D+ ^把代码贴上来看看?

    0 Y3 w2 {& r# p, B) y1 r6 R1 ?8 B+ L0 P, F& }* f7 W1 L$ F
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)# z7 S4 [( h) S
    {
    # P0 N' r) Q0 D0 `$ Z        comp temp, xtimesy;
    / [! l2 ^. x4 T! t( ~* |! i- W6 |        xtimesy.re = 0;9 v* n) a0 v. w% H* l* [& f" Y
            xtimesy.im = 0;
    4 e- t8 @/ ]; O& h8 j        int j0 = lenB - 1;1 I7 d3 p2 L. E: A
            int    i, j, i1, reali;
    + `6 w1 L8 j, P" d1 b) j& G7 Q        if (lenA % 2 == 1)
    , n4 D9 [8 x+ {- f# Q                reali = lenA + 1;
    , y$ Z) o7 H7 e& p0 x        else
    : T( Z, c* J- H# @& F4 y6 ^7 a                reali = lenA;
    : @' z' M9 F0 @3 _        reali /= 2;" \; H! J& k0 y
    7 y! W/ Y, _. E1 T
            int nconv = reali + lenB;
    $ H; ~# m1 ^% z: b( }        //#pragma omp parallel for
    + m/ i+ \4 F7 K/ K8 [4 d# U, X        for (i = reali; i < nconv; i++)0 c- Z9 Y% E5 u! _& g
            {
    0 w) V0 T* A  J+ R7 @, S7 \4 P                temp.re = 0;/ @8 m# h/ i. d! N+ t* F2 A
                    temp.im = 0;; `$ `( g3 ~! _8 ?  A
                    i1 = i;
    % ^/ c. B) H2 T! g  E' g                for (j = j0; j >= 0; j--)8 I. n$ ?/ C8 K) i
                    {
    * H) }; b3 [$ z0 C& t5 |& M! f                        /* floating date operation */
    4 K- w) y5 G6 {; o( B                }
    $ h9 _4 z/ Z) t+ u0 n$ c
            }0 w/ |+ a# B; S9 \
    }* q( y3 y  f4 Q4 F% F
    & h; g" D5 S, R& M
    xcorr函数代码如上,comp是复数struct, 做过长度为11、19两个矢量的测试,和octave结果完全一样
    ' P2 {" k$ j6 o6 ^3 M* s/ {/ Q+ U$ X
    红色部分是内循环,现在其内部操作都comment out 了, j0大概是 6000。
    7 D9 Z% t1 W; s/ _! ~现在call xcorr 100次,耗时78s.1 A: A/ r2 Y7 r) M- T" N. T

    $ @# t# P$ A8 I  ]5 ?如果把红色部分内循环本身完全comment out, call xcorr 1000次,耗时 <1s. & c4 q$ ~1 l' U9 ]: Y
    0 Q- K8 i5 l7 Z1 H
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    6#
     楼主| 发表于 2022-9-25 00:17:17 | 只看该作者
    风雨无阻 发表于 2022-9-24 23:33) P" F6 }2 g2 L( T5 \9 p
    Maybe Debug mode?
    0 d0 w4 ]3 W+ s9 i3 i0 O

    ; ~: v$ E( D: l+ y1 ^4 t3 ^& H" m; i不应该,看我上面的回复。
    0 h7 C+ ]/ R4 |( |) t  L( g8 P, S' U; ^
    我更怀疑是 VS 社区版的问题
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2025-10-27 04:12
  • 签到天数: 1953 天

    [LV.Master]无

    7#
    发表于 2022-9-25 00:20:10 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 00:24 编辑
    7 I2 M* [8 G* t$ ~9 u
    雷达 发表于 2022-9-24 23:54
    , U; U, p! u3 V1 yvoid xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    0 z7 r+ G  }" [1 t3 a* `9 I{+ n( e: @8 u9 w8 w9 I
            comp temp, xtimesy;
    * |$ H; h+ W, e5 m. r* s( g
    ( }6 X: ~( S( O4 C4 k
    这个不是这么比的吧。。。
    ! T/ z! r7 w. X- F/ \# e  ^7 t! ^
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。5 M- I- O, [+ V) n4 t. G( r" T
    ' [3 u! v/ N7 f$ A4 a+ C
    而加上内循环,光jmp和dec指令就至少多执行了6000个,慢个几十倍不是正常的么?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    8#
     楼主| 发表于 2022-9-25 00:46:56 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 01:09 编辑 % V* z3 k; t2 k# G0 k) Q
    数值分析 发表于 2022-9-25 00:20$ k$ U6 `2 W4 Q$ I, e& b
    这个不是这么比的吧。。。( l4 V4 b- }6 [5 l
    - L/ e( e4 L+ j. H) q1 A0 ]& Y" f
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。

    ! k2 [5 _) `0 T% I
    5 k+ d4 N7 z% z7 @7 G3 w& ^. Q$ }. G有道理。7 w9 u/ M; R$ a$ y* a7 j& O
    所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,记得 numeric 库里有算向量内积的,我回头试试。3 [3 a( N, S/ j) F7 |$ h8 a
    / j3 t% [7 P! u( O3 c
    我先尝试尽量用标准库,一个小程序,不想搞得太复杂。多谢了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    9#
    发表于 2022-9-25 01:27:53 | 只看该作者
    雷达 发表于 2022-9-25 00:46/ K% f1 o* Z/ g; a( }7 V8 M7 w
    有道理。( \- C8 ^( X+ ]- |$ p
    所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,这大 ...

      G$ t  p  C) v" l' X4 O' f你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子,把循环本身翻译成机器指令loop或dec/jnz,两者速度上会差很多0 W: }0 ~9 `9 ~, t4 L
    Why is the loop instruction slow? Couldn't Intel have implemented it efficiently?
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    10#
    发表于 2022-9-25 01:48:51 | 只看该作者
    数值分析 发表于 2022-9-25 00:209 F5 @- H5 T- U/ P  v/ K* v8 x, n
    这个不是这么比的吧。。。0 v0 ]3 G1 N; T# M3 C8 m( S% u

    $ T% Z2 l5 C* Y5 J您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    而加上内循环,光jmp和dec指令就至少多执行了6000个
    # u& E) Q2 O: Y% W' ?3 W. N" ]

    3 G3 A0 w$ k& Q" W1 R3 y' {# S: A现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果循环这样跑,花不了多少时间。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2025-10-27 04:12
  • 签到天数: 1953 天

    [LV.Master]无

    11#
    发表于 2022-9-25 02:06:44 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 02:16 编辑 : M. O' ^( g! Z+ n5 u2 T
    沉宝 发表于 2022-9-25 01:48
    / `5 h+ }4 U6 }$ R7 ~/ u现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果 ...
    + _9 `6 F3 P! @4 ?$ A

    - C9 u( r( P/ C" U是的,兄台说的对。
    2 E* z) t! z5 G/ |9 I8 K( r0 s
    0 A& @; l  G" ]+ R# }# X其实我想说的是 真正数值计算部分和代码中其他不直接计算的overhead的比值这个事儿。
    ) Z7 \" `; ~! \! A, ^( ?9 j0 q: j8 C  W# H
    雷达兄构造测试用例的时候,屏蔽掉了所有计算的部分,使得剩下的都是overhead,这样run time比较的结果就显得好像不合理了。如果把计算加回去,计算部分的run time会dominate,结果就不那么离谱了。因为不好说,所以用指令数对比的方式试图直观地说明这一点。
      Y$ [2 Z# z5 b" _; U: \9 R( h; F
    4 p! @% A, e( w0 H8 H$ o% L% M比如说,如果有计算,那么跑六千个循环相对于计算应该用不了多少时间。但是如果一边是什么都不做,另一边是六千个循环,那六千个循环比什么都不做慢几十倍了,就不是那么不合理了。, b1 |8 @) H  ~% m  w

    0 g$ k0 ]8 I6 W" K+ b/ b当然也有可能像兄台说的,是优化参数的问题,但我觉得更多地是测试用例设计的不合理。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    12#
     楼主| 发表于 2022-9-25 04:47:43 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 04:49 编辑
    8 a. E7 I) {/ @1 C1 D: A7 X
    沉宝 发表于 2022-9-25 01:27
    0 ^; z, Y6 ]: @6 S& v* e你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子 ...
    4 M+ G$ B+ v2 g/ D4 y  r

    ! ]; l7 Y6 H' d7 t$ q* t又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差一倍,我上面这个差的太多了。6 h$ |0 i1 w# e$ `
    ' j( q3 {0 e% N5 d0 }9 X0 O( n8 k
    我已经完全懵了。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    13#
    发表于 2022-9-25 05:51:23 | 只看该作者
    雷达 发表于 2022-9-25 04:47( r/ k% o0 l; Y2 Z- S/ x
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...

    * _1 S' Q1 B2 a时间差一倍的结果可以接受。
    / b. O% }# F# v! b6 _6 n! }
    5 n$ R  [& V' N3 K) c: `/ r9 `你还是用profile工具看看吧。现在大家都主观瞎猜。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2025-10-27 04:12
  • 签到天数: 1953 天

    [LV.Master]无

    14#
    发表于 2022-9-25 14:58:59 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 15:38 编辑 + }3 V) C# _  w' i+ q
    雷达 发表于 2022-9-25 04:47) ]0 [# _$ x1 I! n5 B
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...
    + L. `1 v: r4 D5 P, G

    3 o" d  L7 t3 y3 \; p9 _
    2 D' Z  y( m4 a& [% P
    9 G* _6 \" j9 o% z9 N能不能把这个也贴上来,看看和上一个有什么不同?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    15#
     楼主| 发表于 2022-9-26 01:30:03 | 只看该作者
    本帖最后由 雷达 于 2022-9-27 01:17 编辑 / K+ u1 Q4 m5 n' E
    数值分析 发表于 2022-9-25 14:58
    8 u7 |3 c( N, k4 M9 p9 A* t+ F能不能把这个也贴上来,看看和上一个有什么不同?

    3 E& d1 m4 R  s理了理思路,重新做了一个测试。
    . K" M" A8 [, q% g4 J7 n  R做了两个 vector 和 两个 float *, 都长 100000* |5 M- {! ~9 `# M
    外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache., x9 b8 S) ~- q

    ' s& z1 n( _9 l& h  ?3 j7 C内循环试了4种方法,2 t$ F7 z4 ~1 M& i) k
    1. 直接调用 vector inner_product 247s ' ^: j9 a5 v* W) h# {
    2. vector 循环点乘累加 237s# V- X1 L8 \, u( g+ m. }$ I" m
    3. float * 循环点乘累加 204s
    0 I9 M& d9 J# E, m6 v( ?5 m4. 空循环 100000 次 202s5 l, g& T) P+ B+ w5 c

    4 H$ M; H' r# q( n# B  B, B不做内循环 200s# Y8 X* B  I% k; r. i

    + h8 \* s/ s& ^( S5 f你昨天说的对,内循环本身占比是很小的,大头在其他处理。* h* Z# h9 n' R5 Q) A% k
    另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
    ) o! ^4 \( t. ~+ B
    , U# G3 I8 f1 y  [/ E* H至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
    ) m9 x0 n! g1 d2 T5 D# [1 h2 ?2 ^. U1 |6 v1 n+ t
    (为什么下面我贴的  b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成  jj 好了,原来 方括号里的 i 是斜体标志  LOL)* E& B+ z0 o. T( P) f
    ) u8 |5 A) ?7 M) G
            std::vector < float > vec1(N);6 c* G( _, |4 U. H
            std::vector < float > vec2(N);
    ; R8 y5 ?# s$ L, s( K0 K        float* b1 = new float[N];
    + J. S( z& D4 [4 O! _# ]        float* b2 = new float[N];
    $ e5 o6 }1 e4 j( t" G9 q  B( S" r  d8 R
            for (int j = 0; j < 6000; j++): o' X$ K) N, ]. _0 l! P
            {& _) W# `, G% H" |- H8 J0 @0 N  f
                    std::generate(vec1.begin(), vec1.end(), []() {
    ( E" T4 k9 L+ ?% N7 X( L' s5 p                        return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;; z5 E* x1 ?% W! |
                            });
    % _6 }. B4 `, q9 M  _: T8 B) c/ X5 P5 g/ \$ f- R
                    std::generate(vec2.begin(), vec2.end(), []() {
    ' j( V8 V$ [5 ?                        return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
    5 p% J) U! S4 r  o. _                        });: I, [) ]( \+ }. e% p6 m3 V

    / i" S% L: _, n                for (size_t jj = 0; jj < vec1.size(); jj++)( e3 w0 z, U- Y- i9 Q
                    {
    4 C% r6 U: m) H: x- o7 v                        b1[jj] = vec1[jj];
    # j2 b5 J2 b* Z# a4 }                }
    2 ?% {( O4 D+ }' B, W8 \' D! ~! u  z' p# b
                    for (size_t jj = 0; jj < vec2.size(); jj++). O" o! |" x7 u. b# M9 k7 o& i$ z. y
                    {
    9 N: Q+ L( r5 @  v% m8 v0 {: m8 Q0 U                        b2[jj] = vec2[jj];. A5 \! r& G7 O1 `6 C% P
                    }
    ( Z$ C2 [/ \8 G+ ^1 ~! U  T% p( L
    7 j* h" T, \( M# X$ t                //Method - 1  N=100000 247s  
    2 a# O  U3 V; M" }( _                //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);& p0 E! a) w* n
                                    
    & |" {3 x# F# R" x7 @                //Method - 2  N=100000  237s
    * Q+ i* f- o9 z" H: X                /*
    - j1 H6 k  c; |  h( i                for (int jj = 0; jj < N ; jj++): q4 ^- z1 g+ N+ M; E' v
                    {
    $ h! l! t* n# B0 R( L- C                        fresult += vec1[jj] * vec2[jj];* I0 R+ @: X% f2 a/ K
                    }
    1 f0 N' R6 p& ~1 ?6 A. E+ `5 X                */2 M. e/ m* N: U1 S" n  T* i2 n$ Q
                                    + U+ O9 i) s0 z# F: `% Q1 m
                    //Method - 3  N=100000 204s
    8 Z* c) R9 w+ O                /*; H; _) }% A0 B1 `; b
                    for (int jj = 0; jj < N; jj++)
    # l: [8 U, ^8 r; W                {
    9 \% r2 G& u0 h6 \; R                        fresult += b1[jj] * b2[jj];3 H% Z* M: Y# i( c$ c* ~  h
                    }
    # }3 O0 ?! p5 t/ [* c3 Q+ x# s. K                */
    # i& D$ R4 `/ V% S; a3 {7 m3 A) D/ A3 s7 E/ x0 L
                    //Method - 4   202s
    8 P  M5 P" f5 }( X. I  m                /*
    ' z& h4 I: }; E& l! Q                for (int jj = 0; jj < N; jj++), A6 S3 R+ B8 `
                    {
    8 o- L) P8 o: e1 e, a' i( ?                          B6 ^4 i. }3 j, e8 }, [. h9 @
                    }/ k( D4 }) t/ u' R+ V) H
                    */
    , ]$ u1 s% A: i0 s2 a! M/ M                //comment out all methods, N=100000  202s                - l% o) R# v) A/ o( {6 a
            }
    " I; D! P/ `* {( F" t6 }- \6 I  _$ [% _* ?5 D: n5 U  E$ {
            delete []b1;
    9 j) w; p2 D& d2 a9 r3 n+ @+ ?        delete []b2;

    / f% a) k/ Y/ e, s2 Q8 e) B
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    16#
    发表于 2022-9-27 00:15:38 | 只看该作者
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?
    + c7 b$ d2 O( h& p1 I& }
    4 C9 X, L  d4 E# c7 d7 r你第二个试验里面的j在循环里面又重新定义了啊,你确定真的跑了6000次?
    ; j. t$ D5 y1 B1 m+ H1 ~3 Y
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    17#
     楼主| 发表于 2022-9-27 01:16:03 | 只看该作者
    机器猫 发表于 2022-9-27 00:15* _! W8 F* q6 N- P  C
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?0 M+ P$ X& Q: a1 Q: g, k- f! b
    ; Y1 j; w. M9 z! Z5 n
    你第二个试验里面的j在循环里面又重新定义 ...
    & e& Q/ `% a. k% L* G! X+ v
    内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL! B' D* e6 E; f

    * u; {( U' H- G$ ]5 ?5 I) v不和它较劲了,瞎耽误工夫,我已经转到 ubuntu, 也准备顺便试试 avx2 向量化。
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    18#
    发表于 2022-9-27 02:06:58 | 只看该作者
    雷达 发表于 2022-9-27 01:16
    ) z+ {4 x6 M9 ~, D+ R内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL- F" v  C3 ]* g4 D0 w

    8 O$ c1 X0 R1 L/ Q, I6 P! A不和它 ...
    ( Y5 T* v3 u% L' Z3 I7 U
    ( ~, S& \& Y1 o2 v. p
    不过可以试试我说的register变量。前一个试验j是混在一堆其它变量里一起定义的,很有可能是在stack上,这样内存读写会更多,要是再碰上每次都需要加载cache就更慢了。
    6 X" l, X: z  D2 T6 F后面一个是在循环那里定义的,说不定编译器就把它优化成register变量了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

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

    使用道具 举报

    该用户从未签到

    20#
    发表于 2022-9-27 20:29:50 | 只看该作者
    雷达 发表于 2022-9-24 23:54
      }, n! \) J$ m, k- i" ^7 E: Rvoid xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)5 A( p3 B" C6 h; Z
    {
    4 Z5 h8 D6 s  T. V+ U        comp temp, xtimesy;
    1 I# }* b6 \* \2 ~) Q+ X2 D. m$ Z, p
    这个code里面如果Openmp没有被注释掉的话,那么temp那个变量应该是定义在循环里面,否则线程之间会存在争夺写入那个temp的风险。2 S& W3 Y# n3 W! Z
    内层for循环如果没有内部操作的话,编译时应该被优化掉了,和你完全注册掉整个循环是一回事。可能你的编译设置没有打开优化?
    1 O6 o1 Y) p0 \. P/ c+ E5 ?VS社区版没有问题,我工作用的就是社区版,设置正常的话不会比商业版差。以前游说头头用Intel Compiler,他说不想花钱,而且差不了多少,就一直用到现在。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2025-12-24 16:34 , Processed in 0.040906 second(s), 20 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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