设为首页收藏本站

爱吱声

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

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

[复制链接]
  • TA的每日心情
    奋斗
    2024-3-29 05:09
  • 签到天数: 1180 天

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2022-9-24 22:54:26 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
    C++ 比 Octave 慢好多,怎么破?
    ' a3 w# }2 Z: p, K# p% x, v
    6 ]+ ?- b1 y' z+ b4 d. ~! U4 V自相关两层循环,内层循环涉及浮点数计算,试验了一下把内层循环内部全都 comment out 只留个壳子,  但空的内层循环本身就把速度拉下来了,看来问题并不在浮点计算。
    ( j8 s' {. L. V3 [. i+ X0 T! J* [: c8 q/ Q8 k
    速度优化问题真的很有意思啊。
    5 ]! W  q& t5 d. c  T6 O3 z3 ]' \1 C, v9 D0 t6 S
    欢迎大家继续讨论

    评分

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

    查看全部评分

  • TA的每日心情
    开心
    13 小时前
  • 签到天数: 1646 天

    [LV.Master]无

    沙发
    发表于 2022-9-24 23:04:16 | 只看该作者
    拉下来?拉多少?2 i# ~* {& U/ a4 ^6 \" z
    把代码贴上来看看?  X4 z* w- ~' h/ Q$ W5 r& v
    ; \5 |9 X. ~4 G: N
    难道分支预测不准破坏流水线执行?不该啊。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

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

    使用道具 举报

  • TA的每日心情
    开心
    2024-4-22 03:36
  • 签到天数: 120 天

    [LV.7]分神

    地板
    发表于 2022-9-24 23:33:02 | 只看该作者
    Maybe Debug mode?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2024-3-29 05:09
  • 签到天数: 1180 天

    [LV.10]大乘

    5#
     楼主| 发表于 2022-9-24 23:54:10 | 只看该作者
    本帖最后由 雷达 于 2022-9-24 23:57 编辑 1 j( O/ Y; O, \+ `7 g
    数值分析 发表于 2022-9-24 23:04
      a! R8 e0 s8 V: \2 Y4 V* }8 I拉下来?拉多少?
    6 C9 H  ^( N& a2 ^! j) z把代码贴上来看看?

    . a6 t" c/ F' t; W6 n/ R' m' K( D1 h* p2 V' f
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    . D5 G; P( A# E! r/ L" Z, |/ v{
    1 ]+ ]3 K2 V% S" x3 O        comp temp, xtimesy;& i8 S7 F9 H& g9 S
            xtimesy.re = 0;
    ; x2 n/ N0 M! k$ b4 m        xtimesy.im = 0;+ P5 }7 o( b0 B( e$ ~( J2 M
            int j0 = lenB - 1;. j8 o( B$ A$ y2 d# \
            int    i, j, i1, reali;* o' w! Z0 K1 _+ U: W: Z
            if (lenA % 2 == 1)# g! R$ N  Q  y% h
                    reali = lenA + 1;6 _+ [5 Z- w2 o" V+ f
            else1 ]/ Q7 R+ j. y6 d0 M# L0 ]
                    reali = lenA;3 ]# i8 _* h% }& u7 D8 M( S2 n
            reali /= 2;, Y; i, X* j) F
    ' \$ e# ^1 X! o
            int nconv = reali + lenB;2 x, z) @- e8 S) ~+ D5 \
            //#pragma omp parallel for
    - s! c0 w/ l' t2 z        for (i = reali; i < nconv; i++)
      e& V1 W7 a  u        {
    / p: t; K1 `) ]7 q                temp.re = 0;/ ]: Q9 D- r$ L" X
                    temp.im = 0;
    % o6 h# x* W4 \# }% r5 o# {) q                i1 = i;
    9 ~, x, F2 `% W# q                for (j = j0; j >= 0; j--)3 \* s3 }; Y) x/ y
                    {
    2 z& T) \& `  d. q2 b3 j                        /* floating date operation */7 L0 X0 U  `6 N  r
                    }
    3 t' o- \8 [7 L3 }% @4 G9 B+ K
            }
    3 }( |. |/ P9 u% [2 H1 {$ a}) X. F$ G3 }' H  Q  T

    2 }6 y2 j0 F; t! p# q* |* Dxcorr函数代码如上,comp是复数struct, 做过长度为11、19两个矢量的测试,和octave结果完全一样
    8 h* E% C' i  b! o/ p! W7 Q+ q" e$ P9 W& c+ t) d0 s
    红色部分是内循环,现在其内部操作都comment out 了, j0大概是 6000。8 `0 q5 S6 \4 _$ g5 ~- c
    现在call xcorr 100次,耗时78s.9 ^1 a! e, ~' b" A

    ; v. v2 {+ p- g; t如果把红色部分内循环本身完全comment out, call xcorr 1000次,耗时 <1s.
    4 C. e- B& L5 M( g
    ! ^7 h9 @/ L, h* A" \
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2024-3-29 05:09
  • 签到天数: 1180 天

    [LV.10]大乘

    6#
     楼主| 发表于 2022-9-25 00:17:17 | 只看该作者
    风雨无阻 发表于 2022-9-24 23:33" e, A  h- h0 j9 ~5 y# ?
    Maybe Debug mode?
    : s: ]2 L9 j+ [3 Q

    1 |7 K. p( L5 H3 {不应该,看我上面的回复。6 Y3 {2 L0 ~; C7 n8 x0 _' _: L. }

    * j( e5 U8 u8 d" ]* I我更怀疑是 VS 社区版的问题
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    13 小时前
  • 签到天数: 1646 天

    [LV.Master]无

    7#
    发表于 2022-9-25 00:20:10 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 00:24 编辑
    ! S$ x# c" H6 `4 K4 N8 J4 l' d
    雷达 发表于 2022-9-24 23:54, g8 E! v1 e0 f! ^
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    ' r2 Q2 t- C. I6 |{
    & H. S- a4 S1 n6 J) p4 R- S* s5 T        comp temp, xtimesy;

    . z7 `: o6 s" |+ E! Z. I: ?
    ' C$ k/ H8 f( s# d/ \这个不是这么比的吧。。。
    2 t6 F) y6 [1 Q" Y) @+ Q2 \0 w  O5 o2 [8 p  X; h6 Y
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    9 p% O' t& G' W' y* ?: V0 X) }# u; ?( @, ]8 E2 @8 b( M
    而加上内循环,光jmp和dec指令就至少多执行了6000个,慢个几十倍不是正常的么?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2024-3-29 05:09
  • 签到天数: 1180 天

    [LV.10]大乘

    8#
     楼主| 发表于 2022-9-25 00:46:56 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 01:09 编辑
    7 }' Z2 r! f/ v3 z; E
    数值分析 发表于 2022-9-25 00:20
    ) E# B+ w' X- r' G/ e这个不是这么比的吧。。。
    ; Y3 o6 ~4 }+ o: [2 O$ C" t
    1 ?" r7 ^9 p6 }8 M您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    0 ^  V( P- Y! m8 \! A" `

    7 H9 L* c$ M+ ?" q0 m' c有道理。9 B# i# i: y5 ]8 C
    所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,记得 numeric 库里有算向量内积的,我回头试试。
    ( E% K; @. |$ {9 W2 l+ b- n9 k% a! s" ^5 a
    我先尝试尽量用标准库,一个小程序,不想搞得太复杂。多谢了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    9#
    发表于 2022-9-25 01:27:53 | 只看该作者
    雷达 发表于 2022-9-25 00:46
    ! E) S8 D# H3 i0 w有道理。
    ) k7 Q1 l6 K" }* k% u9 ^所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,这大 ...

    ( m" g7 n  K3 W1 {- l, ~你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子,把循环本身翻译成机器指令loop或dec/jnz,两者速度上会差很多0 V1 z' Q* f/ ]7 X1 Q
    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; Y3 B4 E6 J+ {. t: j" I
    这个不是这么比的吧。。。8 k4 N. d# Z2 f' P4 g
    & n: j, K% j' _8 e( u# X. g( ?) e
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    而加上内循环,光jmp和dec指令就至少多执行了6000个
    * Y! [; L$ U9 Y  `8 l* A3 \+ H* y
    ; ~# L8 S, }" z7 k) ?
    现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果循环这样跑,花不了多少时间。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    13 小时前
  • 签到天数: 1646 天

    [LV.Master]无

    11#
    发表于 2022-9-25 02:06:44 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 02:16 编辑 " S; T" G2 b/ Z9 k( H- ^- `
    沉宝 发表于 2022-9-25 01:481 F& ]% @3 \" w1 l: V$ p$ R) B! \
    现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果 ...
    + l9 }# @, m0 E* d/ Y# a7 r: ~& ?# I
    0 O" I0 i" T& a* A7 }' \
    是的,兄台说的对。
    9 I2 @4 n  S, K+ l$ X$ r1 r
    / ^5 _1 x6 h+ _7 c7 K" W其实我想说的是 真正数值计算部分和代码中其他不直接计算的overhead的比值这个事儿。
    + O( K. x* W; t7 h3 Y
    , j0 g  m: K" C1 D雷达兄构造测试用例的时候,屏蔽掉了所有计算的部分,使得剩下的都是overhead,这样run time比较的结果就显得好像不合理了。如果把计算加回去,计算部分的run time会dominate,结果就不那么离谱了。因为不好说,所以用指令数对比的方式试图直观地说明这一点。/ w4 I  C1 a0 y
      D0 b5 D% Q" _* r2 p8 e7 r
    比如说,如果有计算,那么跑六千个循环相对于计算应该用不了多少时间。但是如果一边是什么都不做,另一边是六千个循环,那六千个循环比什么都不做慢几十倍了,就不是那么不合理了。
    3 C: u/ R: \& \8 S5 U/ [& Y0 _2 ^, M* D! w; N* V7 c; O
    当然也有可能像兄台说的,是优化参数的问题,但我觉得更多地是测试用例设计的不合理。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2024-3-29 05:09
  • 签到天数: 1180 天

    [LV.10]大乘

    12#
     楼主| 发表于 2022-9-25 04:47:43 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 04:49 编辑
    : y0 _& I1 h) P1 ^
    沉宝 发表于 2022-9-25 01:270 c* j7 }1 `) ?: e- E
    你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子 ...
    , Z0 R% \( t+ ^1 o9 A( m

    3 q8 v) @$ |; k+ A' ^* Z  q( X; r又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差一倍,我上面这个差的太多了。- B4 ~1 W! }; g0 B

    1 [: Z4 c* D1 k" I& F/ K, h; l我已经完全懵了。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    13#
    发表于 2022-9-25 05:51:23 | 只看该作者
    雷达 发表于 2022-9-25 04:47
    6 f7 }' n+ [% }# W9 z0 v4 Y- y又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...
    0 p$ J! h8 `  c1 y) l: v1 V
    时间差一倍的结果可以接受。+ D/ e' g: S- A; R
    9 s% e$ @$ Q' \" H$ f3 l3 O( F
    你还是用profile工具看看吧。现在大家都主观瞎猜。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    13 小时前
  • 签到天数: 1646 天

    [LV.Master]无

    14#
    发表于 2022-9-25 14:58:59 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 15:38 编辑 ; ?- n" O+ n9 A
    雷达 发表于 2022-9-25 04:47$ I2 v/ h& Q: r  l7 a% x# F
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...
    7 T& Q) g; W! i0 g
    7 L2 @3 }1 }# J& I& |; {

    " y, i* e4 a7 }$ L- v& e: [/ ^" M6 P6 O+ i6 O
    能不能把这个也贴上来,看看和上一个有什么不同?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2024-3-29 05:09
  • 签到天数: 1180 天

    [LV.10]大乘

    15#
     楼主| 发表于 2022-9-26 01:30:03 | 只看该作者
    本帖最后由 雷达 于 2022-9-27 01:17 编辑
      z, q' ~6 X8 q
    数值分析 发表于 2022-9-25 14:58
    8 x3 V5 A% n" c- F6 t能不能把这个也贴上来,看看和上一个有什么不同?

    7 @# D. }( B% U2 S( [4 ~理了理思路,重新做了一个测试。
    - [  A8 t( m' k# y% |做了两个 vector 和 两个 float *, 都长 100000- w/ ?* k+ C# m
    外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache." ?5 i* d) L4 M; Q0 Z$ d9 s6 _

    % o) _0 D4 n5 Q" V内循环试了4种方法,
    : Q+ E8 U1 p- F# S1. 直接调用 vector inner_product 247s
    0 K8 J/ C- R- Z2. vector 循环点乘累加 237s
    7 g+ [$ \* @" Y5 s, ?1 J3. float * 循环点乘累加 204s
    6 b& {8 T$ l3 O4. 空循环 100000 次 202s
    & I& i9 d1 ^6 R: e
    . {  Z$ ^& H( N# b不做内循环 200s0 ~; Y6 ^, J' T0 u
    - D* Y* F, S/ L5 d
    你昨天说的对,内循环本身占比是很小的,大头在其他处理。
    4 O% x& P: c& J" D- q另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
    1 `5 p! @  h$ w+ m6 Z4 H# Y# J6 W
    1 w! ~+ p. s4 t至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)# a) f& R0 T+ c# }) u& j3 \
    2 h  O8 j) \/ C
    (为什么下面我贴的  b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成  jj 好了,原来 方括号里的 i 是斜体标志  LOL): D2 i0 v" d. Y6 [& T
    ( }  H8 x" S9 B- V
            std::vector < float > vec1(N);
    % Y/ u  f& g! X0 b  U8 x        std::vector < float > vec2(N);$ z- t, {6 {. }/ f; V" A6 A/ a
            float* b1 = new float[N];
    5 K) q( N# W' y% m2 G3 p5 E  P        float* b2 = new float[N];
    - c- w1 u  [" U8 V. }1 u& S4 a6 @" f0 Q
            for (int j = 0; j < 6000; j++)
    * G7 W. R; Y( ^0 I# j        {
    " f! q7 s* o5 X9 {                std::generate(vec1.begin(), vec1.end(), []() {' L: \6 j- T6 _
                            return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
    ( i, J% X6 L3 L                        });* L3 P- c' `  i# z. M: U. m

      x: L) h) u9 e$ ?* p# m: c0 |* e4 A                std::generate(vec2.begin(), vec2.end(), []() {5 L# X1 w4 o; `% R# ?
                            return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;$ n/ c' G, |' [: Y$ K
                            });: Z( `/ Q, m" [' U2 c3 O) e

    2 ^/ Z6 s2 Z  _) i4 w                for (size_t jj = 0; jj < vec1.size(); jj++)
    3 a0 H4 X% b  P1 E; k. J. k$ t                {
    2 O. o* ]) W9 c* K                        b1[jj] = vec1[jj];* i3 _4 q- n7 `$ T
                    }
    3 T9 C3 P% {% c1 G" _! ~
    9 ~) Z1 T: w! _, |6 \7 D8 A" D                for (size_t jj = 0; jj < vec2.size(); jj++)
    6 o3 p, a( w1 x: M5 O% S( x) D                {
    5 Z# v; b% K* N4 p                        b2[jj] = vec2[jj];% A+ j2 n# c1 t5 M# Z
                    }
    / A8 T$ e6 q9 t+ s8 {- b0 s9 m  ~9 C7 f1 ^5 E( T
                    //Method - 1  N=100000 247s  
    & d; @$ r, L0 `. I" \) m: N                //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
    2 Z% P2 B- I1 o5 W9 j                                
    ' M9 s, l: p; P9 L7 x6 Z& H7 L( \) y$ \" G                //Method - 2  N=100000  237s
    ' b' }7 M2 g- i$ t" s                /*
    $ v, [) j2 S+ J/ P' Y, g8 {                for (int jj = 0; jj < N ; jj++): X" I# {7 O2 {/ `, E+ L
                    {- f7 j5 G' v4 l( j; i4 u7 O
                            fresult += vec1[jj] * vec2[jj];0 |  ?4 @  J5 ?* [# i9 ]
                    }
    ; X  {) U7 @& t" f" I: q  X6 f* I                */6 v8 p7 p, S' |  x( j8 z, S7 x
                                    
    , O$ H6 M9 `0 y4 @5 t                //Method - 3  N=100000 204s' z; I) @5 Q! X! I7 h/ J. i' y. B
                    /*4 g! d8 v8 t. V1 A
                    for (int jj = 0; jj < N; jj++)
    0 R* {* _  {5 K2 i8 j0 `                {6 |% s5 ~% ?) Y! m) z
                            fresult += b1[jj] * b2[jj];
    + `. _6 u0 P! x" ?' I                }9 |) W# U/ _9 J1 s- x
                    */" S/ @! W6 ~) s+ Z

    ! v( j9 E9 K; X  K8 ?3 y; s; q5 |& d                //Method - 4   202s
    3 q( r- A8 M" t4 m                /*4 J# e# `; O  D$ h" V
                    for (int jj = 0; jj < N; jj++)( p# b: t* W) a
                    {: V0 X: p3 ]7 D9 D
                            
    # a0 X9 d7 ~5 m& V; {) k8 M$ _                }
    2 C* S! W, B; e3 F- d                */9 H% E/ i! D5 R# G
                    //comment out all methods, N=100000  202s               
    7 ]) i( J% A% E$ _' k7 F/ T        }4 e# Q3 j/ o0 M" C" K* \3 F1 n6 a" C, V
    " u) h9 W5 ^2 j, P! S2 Y2 N
            delete []b1;
    % k9 D1 Z1 v6 B8 f# e        delete []b2;
    ) p, u0 I- ]7 d: @
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    16#
    发表于 2022-9-27 00:15:38 | 只看该作者
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?; S% j: m4 p7 X1 h& d

    ! M: X: o: [# p' U# L1 ^你第二个试验里面的j在循环里面又重新定义了啊,你确定真的跑了6000次?3 A  C5 T" Y1 G) Z9 |7 g
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2024-3-29 05:09
  • 签到天数: 1180 天

    [LV.10]大乘

    17#
     楼主| 发表于 2022-9-27 01:16:03 | 只看该作者
    机器猫 发表于 2022-9-27 00:15" O& g) n9 k9 L/ z* }
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?
    # C$ `! g% b3 @/ \  ^% D+ n
    3 f$ J) R; N6 M你第二个试验里面的j在循环里面又重新定义 ...

    & ~1 ^" b5 C* \. A" {& p. x+ s内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL1 o; w% Y/ Z. e0 n* H1 P- K4 k
    % P' C3 b" i: M' U2 [
    不和它较劲了,瞎耽误工夫,我已经转到 ubuntu, 也准备顺便试试 avx2 向量化。
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    18#
    发表于 2022-9-27 02:06:58 | 只看该作者
    雷达 发表于 2022-9-27 01:16
    ! U+ F7 e8 V) @- [- F& j6 x  ~8 U, u$ H内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL+ d- p( {( G( D
    ( t8 L9 H) O: v0 K5 ]+ o6 l
    不和它 ...

    ! q) f4 g9 N. A: K* ?  K' f  |- n# X1 p; W
    不过可以试试我说的register变量。前一个试验j是混在一堆其它变量里一起定义的,很有可能是在stack上,这样内存读写会更多,要是再碰上每次都需要加载cache就更慢了。
    ! d: r8 i1 M3 a; x' W0 I# I7 e1 z后面一个是在循环那里定义的,说不定编译器就把它优化成register变量了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

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

    使用道具 举报

    该用户从未签到

    20#
    发表于 2022-9-27 20:29:50 | 只看该作者
    雷达 发表于 2022-9-24 23:54" X9 o) T" \9 |
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    ; b, d9 p+ R( c# F( y5 Y{1 {; l! k% Z: e2 Q( v- ^$ u9 w5 V
            comp temp, xtimesy;
    8 j% v- r1 p5 Z. _  R0 Z
    这个code里面如果Openmp没有被注释掉的话,那么temp那个变量应该是定义在循环里面,否则线程之间会存在争夺写入那个temp的风险。
    2 X$ X- i* z4 L6 K4 F! \8 }内层for循环如果没有内部操作的话,编译时应该被优化掉了,和你完全注册掉整个循环是一回事。可能你的编译设置没有打开优化?1 F7 p* `; }+ K9 q# z% ^6 ^) r
    VS社区版没有问题,我工作用的就是社区版,设置正常的话不会比商业版差。以前游说头头用Intel Compiler,他说不想花钱,而且差不了多少,就一直用到现在。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2024-5-4 21:03 , Processed in 0.044516 second(s), 19 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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