设为首页收藏本站

爱吱声

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2022-9-24 22:54:26 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
    C++ 比 Octave 慢好多,怎么破?" s2 n- Q$ m3 F! C/ X) H* h0 [

    1 f; b; o" h4 [自相关两层循环,内层循环涉及浮点数计算,试验了一下把内层循环内部全都 comment out 只留个壳子,  但空的内层循环本身就把速度拉下来了,看来问题并不在浮点计算。$ B7 Y* R: S$ m: v5 L7 @

    & O' g# x/ V" W! [  l" J" b  ?/ a" N速度优化问题真的很有意思啊。! P0 Q; ], i; u! Q3 o5 w

    + n, S9 f8 T6 p欢迎大家继续讨论

    评分

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

    查看全部评分

  • TA的每日心情
    开心
    昨天 00:26
  • 签到天数: 1642 天

    [LV.Master]无

    沙发
    发表于 2022-9-24 23:04:16 | 只看该作者
    拉下来?拉多少?
    ; K' S2 I( F# c" [) G$ s2 p把代码贴上来看看?6 _+ [# G! u3 r) _# B

    % m0 H: @! S7 s! m5 k难道分支预测不准破坏流水线执行?不该啊。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    板凳
    发表于 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 编辑 / R5 V+ a) n; ], r; B; q" m
    数值分析 发表于 2022-9-24 23:045 {( T, z; L- I" |* v
    拉下来?拉多少?0 z/ s4 W6 |; b9 d
    把代码贴上来看看?
    + }9 X" L, S' m, J  S! w

    7 U9 _) p1 Q! f0 k! @( L. avoid xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    - G$ L5 N( U4 O! d$ g6 A. F{
    - C5 Z$ ]' |0 }. H        comp temp, xtimesy;
    . ?" w4 j# a! h; z: L        xtimesy.re = 0;4 e# V" e* T/ H" g1 k* M3 N# J
            xtimesy.im = 0;
    , z" J$ }' C9 J1 M. j        int j0 = lenB - 1;
    4 k' m& l3 k- {  t! V        int    i, j, i1, reali;
      H* c; w% r! W9 O( M        if (lenA % 2 == 1)
    , A; b# m3 Z& T2 p# [. ^                reali = lenA + 1;
    * ], s( {0 Z/ s6 W: J( q% w5 ?- p5 C" `        else3 q+ q- M0 d1 X  i
                    reali = lenA;
    6 g+ r  [8 g* J0 m. \8 c2 Y        reali /= 2;
    " T* ?' C1 G* T5 w' i% ]0 F& n' c3 f% {5 d" I' c9 V8 i0 [
            int nconv = reali + lenB;' l" A) s( l6 D, K
            //#pragma omp parallel for
    / A. W$ r* f, X        for (i = reali; i < nconv; i++)
    " ~6 r$ e0 _! }2 l# B4 f" `        {9 H; ~* g* Z' ?6 G1 L2 T7 I/ a
                    temp.re = 0;
    7 }, z6 r8 j" m+ I$ {3 }0 d                temp.im = 0;: c; Q1 d  A5 s' B4 L5 W
                    i1 = i;
    ; z# g! v- D. B, h% N  d                for (j = j0; j >= 0; j--)
    8 T8 R4 j6 p2 u# \                {
    $ o& t  j! A5 U5 N; r# p9 c                        /* floating date operation */0 Z/ d8 @/ i" r9 a3 O4 k
                    }

    ) `" u0 A( h- A# ]6 l% i$ L        }- v$ M1 I4 p# D, j8 y
    }
    , X; p9 r6 k/ n* \6 {) p3 J1 v
    $ d7 l- x' Y: t3 h/ ~xcorr函数代码如上,comp是复数struct, 做过长度为11、19两个矢量的测试,和octave结果完全一样1 F) w5 U# L& v( R

    4 P& q! P# @% i2 J红色部分是内循环,现在其内部操作都comment out 了, j0大概是 6000。5 L# P' B+ J- k3 ^9 T) F4 G8 i
    现在call xcorr 100次,耗时78s.# J! F! e2 K6 j4 B0 @

    ! Z8 n8 Z; D. \6 L如果把红色部分内循环本身完全comment out, call xcorr 1000次,耗时 <1s.
    # Q7 S6 P9 Y$ O
    # j- g9 y& J, J
    回复 支持 反对

    使用道具 举报

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

    [LV.10]大乘

    6#
     楼主| 发表于 2022-9-25 00:17:17 | 只看该作者
    风雨无阻 发表于 2022-9-24 23:331 E: N- M- g8 _  F' B2 w! V8 C
    Maybe Debug mode?
    " F9 J2 }5 r! C$ r. o
    * P% c1 K1 F% c9 s' \3 z1 f
    不应该,看我上面的回复。
    & u6 }; Z! g6 x" T) W$ g# j# Q8 r2 P. _, ^
    我更怀疑是 VS 社区版的问题
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    昨天 00:26
  • 签到天数: 1642 天

    [LV.Master]无

    7#
    发表于 2022-9-25 00:20:10 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 00:24 编辑
    4 r* `+ i/ l( u3 f* c
    雷达 发表于 2022-9-24 23:54
    ' @9 M$ A! H$ F# p( O/ c5 Avoid xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)8 K' D) L$ J4 W) W6 |+ k. U- Q
    {8 g9 I% k6 ^# e
            comp temp, xtimesy;

    9 r% O, m9 r0 ^( {& e8 t' b8 A; G/ ^9 m0 \) ?3 n
    这个不是这么比的吧。。。
    , r7 M* P+ S8 a( L" }
    6 S( w4 p& ]* c您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。2 C1 ~" _+ S: G7 n% R" }; O9 W

    7 ]5 M, T: ?5 [5 x而加上内循环,光jmp和dec指令就至少多执行了6000个,慢个几十倍不是正常的么?
    回复 支持 反对

    使用道具 举报

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

    [LV.10]大乘

    8#
     楼主| 发表于 2022-9-25 00:46:56 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 01:09 编辑 ' U' V9 @5 P# u" P! m6 z7 {
    数值分析 发表于 2022-9-25 00:204 t$ I5 l" ?) J0 a
    这个不是这么比的吧。。。
    + m5 B/ C( S0 X  K5 {6 t; l
    : g1 v$ v: V- F$ f3 C2 ^& A您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    9 L5 c1 j1 ~6 t% A- m* l

    2 I2 z9 r7 K; l4 U; g- z8 r  X有道理。
    6 J4 E0 L, Q" a6 }! w所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,记得 numeric 库里有算向量内积的,我回头试试。
    $ \( D( X. Q: ?2 l' Q1 M+ K% m! N
    , m" C' F9 n7 l; Y# k我先尝试尽量用标准库,一个小程序,不想搞得太复杂。多谢了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    9#
    发表于 2022-9-25 01:27:53 | 只看该作者
    雷达 发表于 2022-9-25 00:46
    ) B/ l. v& d: R有道理。
    ' Q3 T/ {. H; N所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,这大 ...
    ( N+ e. y! O' Y3 F( g0 r' H
    你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子,把循环本身翻译成机器指令loop或dec/jnz,两者速度上会差很多. B9 A* N* j, v* 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:203 z% L" |5 I! ]" z$ p
    这个不是这么比的吧。。。
    ' g6 P* ~; W0 C* T
    4 H( E. X$ M1 D! X您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    而加上内循环,光jmp和dec指令就至少多执行了6000个

    9 m- r7 p$ ]  w* _
      q' E1 c' D( T9 c$ E# k& W# W现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果循环这样跑,花不了多少时间。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    昨天 00:26
  • 签到天数: 1642 天

    [LV.Master]无

    11#
    发表于 2022-9-25 02:06:44 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 02:16 编辑 ( M. e5 k( h5 f. X% ~
    沉宝 发表于 2022-9-25 01:484 c- w; ?& Q" L
    现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果 ...

    + S; j  \8 j0 }4 L1 b( z0 a/ K" ?) k% y: o/ }) O" N! Y+ g* i
    是的,兄台说的对。
    & M9 T( Z/ h5 i$ q% }8 j8 m2 U2 m' `5 E/ L0 a/ l; P
    其实我想说的是 真正数值计算部分和代码中其他不直接计算的overhead的比值这个事儿。% U- h( R% W& j' R) c9 Y8 u' y9 _

    $ s  N  {. V/ |) o雷达兄构造测试用例的时候,屏蔽掉了所有计算的部分,使得剩下的都是overhead,这样run time比较的结果就显得好像不合理了。如果把计算加回去,计算部分的run time会dominate,结果就不那么离谱了。因为不好说,所以用指令数对比的方式试图直观地说明这一点。
    ( Z9 i) {1 g: g. F
    ! U6 j; P9 l5 ~0 c% l1 s! v6 @比如说,如果有计算,那么跑六千个循环相对于计算应该用不了多少时间。但是如果一边是什么都不做,另一边是六千个循环,那六千个循环比什么都不做慢几十倍了,就不是那么不合理了。
    ( e! o$ ~& m* s  q  t8 b# Q9 N1 I& u  g) K( z; I
    当然也有可能像兄台说的,是优化参数的问题,但我觉得更多地是测试用例设计的不合理。
    回复 支持 反对

    使用道具 举报

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

    [LV.10]大乘

    12#
     楼主| 发表于 2022-9-25 04:47:43 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 04:49 编辑 , C" U( ~$ T  `6 c& y
    沉宝 发表于 2022-9-25 01:277 s) a5 H$ z5 ~. s- A8 s6 C
    你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子 ...
    1 ]# m$ h$ p! U2 B2 l

    1 }% r& Q" v( O% [& K又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差一倍,我上面这个差的太多了。$ f' Q" O" @# i1 k6 {; W" w

    5 V: T9 E" g" _% ^: v我已经完全懵了。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    13#
    发表于 2022-9-25 05:51:23 | 只看该作者
    雷达 发表于 2022-9-25 04:47
    % [/ o! Q0 U1 i! T/ I$ o: R又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...
    2 u$ ~. [; c  d- I# l9 ~
    时间差一倍的结果可以接受。
    7 F: Y6 \, Z- e; a3 ]
    ! T; ?, K1 p- \/ Q9 H你还是用profile工具看看吧。现在大家都主观瞎猜。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    昨天 00:26
  • 签到天数: 1642 天

    [LV.Master]无

    14#
    发表于 2022-9-25 14:58:59 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 15:38 编辑 ) i+ U3 T( `, Y8 g2 {8 b3 M+ @, Y
    雷达 发表于 2022-9-25 04:47
    3 b& V6 L. u6 c" v" c$ R" _又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...
    ' z! R8 @& B2 x& p+ g) ^* }* h" }
    & M4 p/ k. B5 O5 h4 u8 [3 T% E; P# _

    # m$ N& N& ]1 G+ \  K+ ?# n. T( ^7 P
    能不能把这个也贴上来,看看和上一个有什么不同?
    回复 支持 反对

    使用道具 举报

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

    [LV.10]大乘

    15#
     楼主| 发表于 2022-9-26 01:30:03 | 只看该作者
    本帖最后由 雷达 于 2022-9-27 01:17 编辑 - k; L8 E6 z% q; ?
    数值分析 发表于 2022-9-25 14:58
    1 v1 s; r: G3 d( A) X& l0 l3 f能不能把这个也贴上来,看看和上一个有什么不同?

      ]# |; W2 X5 K4 C% r理了理思路,重新做了一个测试。
      \6 c* H7 ?" [( G6 k1 |做了两个 vector 和 两个 float *, 都长 100000' ]; L3 o8 ~: X; F( S2 s& B
    外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
    6 Z. }9 _. X$ C; K. i+ V& P7 s4 Q/ \7 I7 I6 P
    内循环试了4种方法,
    + @7 \: K! Y+ \1. 直接调用 vector inner_product 247s
    1 S9 I; M  a% o% X( @% q: p2. vector 循环点乘累加 237s
    & m! C+ }( Y9 J9 a4 w3. float * 循环点乘累加 204s
    " n2 {9 o+ s6 m& \4. 空循环 100000 次 202s8 [% d: b1 L' k3 F
    $ b  A6 n3 i: h0 k$ M5 j8 R
    不做内循环 200s* N" D& i; W+ y9 {3 ^
    3 X! Z" H: I/ i* ?! B' R
    你昨天说的对,内循环本身占比是很小的,大头在其他处理。
    7 g. U% G9 \/ o7 s- t3 T另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。5 o8 b, F$ F# y3 K$ ~; W6 N
    0 g8 z: G9 \3 q
    至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)& J; J$ X4 j, g1 O7 [0 w! }

    1 W0 s8 _0 l- |  E) F(为什么下面我贴的  b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成  jj 好了,原来 方括号里的 i 是斜体标志  LOL)3 h+ F  v+ @' Z0 }4 J
    6 c6 o/ d9 d" E) Z& h3 K, O
            std::vector < float > vec1(N);+ [/ X" |2 a, i
            std::vector < float > vec2(N);
    / ~2 V) c' G, t. R        float* b1 = new float[N];7 f, d2 g$ z5 l( `; u; E: ^# \) X
            float* b2 = new float[N];2 I& \$ @# D* c5 ~- d

    ! L; N; {2 i. {3 o1 p' m        for (int j = 0; j < 6000; j++)
    ' `5 \8 b1 |/ j- X/ l        {
    , i% K' j9 O$ S7 e( A                std::generate(vec1.begin(), vec1.end(), []() {8 Y6 Z2 r7 W8 W" _2 W
                            return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;/ f4 Z+ \1 x( s5 t2 K6 \
                            });  c) i% @' o3 y4 Q
    : g# i  J  \  Y! y* ~, Q
                    std::generate(vec2.begin(), vec2.end(), []() {
    0 l5 z1 R& @1 f2 y- @8 \                        return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;4 b$ A/ ~+ i3 N
                            });
    ! S& J& C7 c8 W1 o/ s3 \; \& H. R: X
    1 e3 g+ V+ `7 t                for (size_t jj = 0; jj < vec1.size(); jj++)1 @) L# m3 V! y
                    {
    1 R6 [5 P: y* {2 ~                        b1[jj] = vec1[jj];4 d! ?3 E+ Z% i# r# u; x7 R
                    }; x8 x. d1 Z9 n6 T, V% V

    ( l$ p. w+ }) z' @5 F1 U' q1 \                for (size_t jj = 0; jj < vec2.size(); jj++)
    0 _. g' B1 A% {+ s9 b9 N                {
    ; G( G, a( \; G1 o! v2 \  {/ T                        b2[jj] = vec2[jj];2 ?# X6 W8 @( G$ h3 W$ {
                    }4 g* z9 w1 A5 Q3 {7 O

    ) t! G' h: t* Y0 |, H4 j                //Method - 1  N=100000 247s  + O2 Q. i0 E: n/ |) c
                    //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);) o) x' B; T, O9 H' E
                                    
    + H( \; n0 z/ a  B                //Method - 2  N=100000  237s
    2 M0 X  E# x) r0 r. [# x) U                /*7 O8 _! q1 _9 I. l; Q4 w% S- e/ @
                    for (int jj = 0; jj < N ; jj++); @! k+ h* Z" t4 W
                    {8 ~# i& ^2 P7 U$ j
                            fresult += vec1[jj] * vec2[jj];8 S9 Q- V2 I5 A6 e- z5 q
                    }
    % d6 y0 H5 V4 h* P$ o; G  r                */1 y6 B0 g6 U2 n3 O  t3 k) I4 U
                                      U% W8 J+ B2 V6 R! @5 G9 h
                    //Method - 3  N=100000 204s8 Q0 v0 V7 @% F& U& ]" I
                    /*
    7 u+ s9 ~, o6 q& j; R8 V" ~& _                for (int jj = 0; jj < N; jj++)6 {4 V; ^1 b5 M* E
                    {0 [! f, |& g$ H# s% S9 |
                            fresult += b1[jj] * b2[jj];) d8 V' Q8 k. J0 ]2 K, ?/ D4 L
                    }  J: S0 D2 H8 }; o1 y
                    */
    7 ]7 Z6 \# n- c- j" k/ h; o
    3 V' t: H: I$ C+ r0 \9 X- T                //Method - 4   202s1 C8 |* q7 W, \
                    /*4 ~, K$ Y0 e& ?) c
                    for (int jj = 0; jj < N; jj++)8 J! ~4 K' A. z& B- S
                    {
    / Y, J# k6 h( n                        4 Q0 o  U: Q& U3 J
                    }5 Z, X+ {! ]: U7 Y3 _; K  r, \4 p
                    */
    % s) U0 E. ]& V* A7 c- Z1 f                //comment out all methods, N=100000  202s               
    . F$ l. [1 V. x  P$ @2 I/ g. E        }
    0 I8 N, `5 i' O  X# `; P. w( X- V' v: l: D  V
            delete []b1;
    # o: v7 `4 l8 Y; k$ o3 O        delete []b2;

    5 b2 Z$ e0 X7 R+ B, u* a
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    16#
    发表于 2022-9-27 00:15:38 | 只看该作者
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?" A- Q4 @! a6 V) O0 o
    2 F! U) H0 _6 H4 F' u
    你第二个试验里面的j在循环里面又重新定义了啊,你确定真的跑了6000次?% Y( I$ t4 V& N% ~! E' I
    回复 支持 反对

    使用道具 举报

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

    [LV.10]大乘

    17#
     楼主| 发表于 2022-9-27 01:16:03 | 只看该作者
    机器猫 发表于 2022-9-27 00:159 R7 w( f1 K9 L5 _' L4 G9 c; ?* h4 I5 @
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?
      u& p4 ^/ O0 c; i3 L$ t* T
    5 Z- ]  u2 }* S+ ^你第二个试验里面的j在循环里面又重新定义 ...

    ( m9 g8 w$ B1 S/ Q内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL
    3 C2 j6 q( k0 S5 C, P' l, m* T' ]  o% L3 z5 U2 C
    不和它较劲了,瞎耽误工夫,我已经转到 ubuntu, 也准备顺便试试 avx2 向量化。
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    18#
    发表于 2022-9-27 02:06:58 | 只看该作者
    雷达 发表于 2022-9-27 01:16' ^; a7 h- @) c0 p
    内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL7 t; {! B( h$ F* Z5 _7 w4 J
    " }: F, K' N2 g) a1 D& j% O
    不和它 ...

    " O* W5 b/ A- B5 i# r  L- ~9 _8 q$ _( x6 a7 E4 w3 E# T+ @
    不过可以试试我说的register变量。前一个试验j是混在一堆其它变量里一起定义的,很有可能是在stack上,这样内存读写会更多,要是再碰上每次都需要加载cache就更慢了。  D; \" K$ r" M% G  J
    后面一个是在循环那里定义的,说不定编译器就把它优化成register变量了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

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

    使用道具 举报

    该用户从未签到

    20#
    发表于 2022-9-27 20:29:50 | 只看该作者
    雷达 发表于 2022-9-24 23:54, z0 c, T& y8 R: `4 ^
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    / _* s1 |) i; N: l, o. y{
    2 ^4 r# l- m( H; N        comp temp, xtimesy;

    9 z# |9 ?0 Y- t9 U" E7 ]4 _这个code里面如果Openmp没有被注释掉的话,那么temp那个变量应该是定义在循环里面,否则线程之间会存在争夺写入那个temp的风险。
    2 o: N  K; E& i% |内层for循环如果没有内部操作的话,编译时应该被优化掉了,和你完全注册掉整个循环是一回事。可能你的编译设置没有打开优化?
    , }4 ^* x1 E1 [% c/ V5 O6 VVS社区版没有问题,我工作用的就是社区版,设置正常的话不会比商业版差。以前游说头头用Intel Compiler,他说不想花钱,而且差不了多少,就一直用到现在。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2024-5-1 00:23 , Processed in 0.050870 second(s), 19 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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