设为首页收藏本站

爱吱声

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

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2022-9-24 22:54:26 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
    C++ 比 Octave 慢好多,怎么破?
    # s$ M' x! x" S, {, G; h" f1 A5 j
    , M- m- C; i( _+ p' z* ?自相关两层循环,内层循环涉及浮点数计算,试验了一下把内层循环内部全都 comment out 只留个壳子,  但空的内层循环本身就把速度拉下来了,看来问题并不在浮点计算。
    - V% b: ~9 a0 g& T
    ! t9 T+ k; }6 J# O9 |! l速度优化问题真的很有意思啊。: |' J6 F5 F( C; U$ G" L( d

    9 }  w; Z( G( ~! g欢迎大家继续讨论

    评分

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

    查看全部评分

  • TA的每日心情
    开心
    前天 02:13
  • 签到天数: 1955 天

    [LV.Master]无

    沙发
    发表于 2022-9-24 23:04:16 | 只看该作者
    拉下来?拉多少?. E+ N8 s  d6 C; r6 ?9 `% w
    把代码贴上来看看?
    " j6 J; _4 T- o' Z5 Z2 X3 h2 d4 o$ Y* q' S' m. w$ h7 D" ^& }) Y8 ~
    难道分支预测不准破坏流水线执行?不该啊。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    板凳
    发表于 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 编辑 0 Y7 s% N( p- q6 ~  q1 O
    数值分析 发表于 2022-9-24 23:04
    * q! n: t7 r1 G, E  G! g拉下来?拉多少?
    $ A7 i+ X( j9 C把代码贴上来看看?

    / a' j$ {$ k0 k" z' g: u. `' k& t5 c/ X% Z& ?
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)3 T0 e" u. p% Y5 K9 F
    {
    7 C! L$ Y' T2 @        comp temp, xtimesy;
    ! e/ F/ J* U  L' `        xtimesy.re = 0;. d6 r7 L" F3 L7 G: ]' Z" _3 {
            xtimesy.im = 0;
    + _% a* C0 t- d. c/ L+ l        int j0 = lenB - 1;
    + f7 `  O) R5 O6 n8 N        int    i, j, i1, reali;
    6 U% m, y. @* i5 q- L! {1 s; x0 d        if (lenA % 2 == 1)% e' C2 {2 i+ q( R! \
                    reali = lenA + 1;1 E5 O/ i% ~6 t: e. A& X; V
            else- B, l" v! E, f7 S( R( c
                    reali = lenA;
    / N8 f. N/ q5 o8 t0 n. h6 V        reali /= 2;4 r, @( o& q' ~: x; `

    0 y* Q4 q5 ~' X( D) w5 S        int nconv = reali + lenB;
    ( s0 n0 n7 h3 M+ q  E- ~" ]        //#pragma omp parallel for
    % D. {2 F/ e% l% k2 x        for (i = reali; i < nconv; i++)3 p5 x; Y( E$ H- z0 }+ q" U! P# I- Q
            {
    " k/ H/ \; D+ K+ g4 W  _- e* H0 ]                temp.re = 0;
    5 U4 O1 ]- D# [: _                temp.im = 0;
    % b# l8 N+ h0 }5 }# ?" y! k                i1 = i;
    % ~2 z" h0 F* }/ g- }( a; N                for (j = j0; j >= 0; j--)
    $ i- k2 j- x# t' Q" q7 q+ c4 \                {# j5 `4 M/ H+ d' O- ]! i3 n4 W
                            /* floating date operation */2 r, e, P# i- }8 T
                    }
    - m$ B8 A3 P8 g6 h! N. ?
            }
    8 k: d6 f' d+ Q. o& ?- n# e( k}5 L" ]( s9 `( I% @' E, M4 ^+ z; I; F

    " u4 D9 c& ^% ^" D& vxcorr函数代码如上,comp是复数struct, 做过长度为11、19两个矢量的测试,和octave结果完全一样. l. A0 N' X; d/ K+ Q
    4 \& W% ?/ N) @/ K9 b
    红色部分是内循环,现在其内部操作都comment out 了, j0大概是 6000。) Q+ N7 u7 L/ \7 t& z- u
    现在call xcorr 100次,耗时78s.4 ~- A3 g/ g/ f5 F- B

    ; I* @0 k/ o; [# ]( j. S6 s& {如果把红色部分内循环本身完全comment out, call xcorr 1000次,耗时 <1s.
    0 Z3 Q- S" w$ U  K
    2 }  m# H+ m, U' x! [0 t
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    6#
     楼主| 发表于 2022-9-25 00:17:17 | 只看该作者
    风雨无阻 发表于 2022-9-24 23:33
    3 n" E( \3 w  c* G  F1 p0 F) l. TMaybe Debug mode?
    1 w' {; \5 c  w3 B4 s
    5 a. i8 v" D6 R
    不应该,看我上面的回复。  D. `; W: X( ?' {

    ) o: n7 @& W' Z% v* U我更怀疑是 VS 社区版的问题
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    前天 02:13
  • 签到天数: 1955 天

    [LV.Master]无

    7#
    发表于 2022-9-25 00:20:10 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 00:24 编辑
    7 x% Q! k5 W+ v/ r% C" g& r2 W$ ]
    雷达 发表于 2022-9-24 23:54, ]3 b* C3 M6 w4 m% p7 N! Z
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)% J+ [1 |: t, {' Y3 O* K
    {0 A/ S$ W$ Q- n( ]  H/ G
            comp temp, xtimesy;
    / j, v! `( L6 g7 @
    8 u; D" j2 {6 _% f4 H1 M1 |' k' P
    这个不是这么比的吧。。。3 H2 ]% P- ^. J& g" ]* [& v/ K

    : y5 X& S& S! w6 z您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。: b0 W" Z& i. M$ s6 m+ M" a) e- X
    ) V' t+ _* u8 t" |7 [8 U$ X
    而加上内循环,光jmp和dec指令就至少多执行了6000个,慢个几十倍不是正常的么?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    8#
     楼主| 发表于 2022-9-25 00:46:56 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 01:09 编辑 / f7 |+ a4 O, f8 B
    数值分析 发表于 2022-9-25 00:20/ ?2 T( M. H- f7 P3 E8 d
    这个不是这么比的吧。。。
    2 I+ ?' y* f! {8 \
    . {+ @) N( Y& z; }您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    0 e, |# F. I. g# U# _

    ; S! z, Z) [) S2 q有道理。* g* [1 p+ \! P
    所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,记得 numeric 库里有算向量内积的,我回头试试。# _3 E  W; m' H9 |
    : x+ |- e7 ]3 r' J
    我先尝试尽量用标准库,一个小程序,不想搞得太复杂。多谢了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    9#
    发表于 2022-9-25 01:27:53 | 只看该作者
    雷达 发表于 2022-9-25 00:46
    1 s6 g7 L+ N) _4 N, h8 L$ U有道理。+ ]8 r% U! B' N- o  Q
    所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,这大 ...
    5 }9 c9 U7 l6 K, X
    你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子,把循环本身翻译成机器指令loop或dec/jnz,两者速度上会差很多0 T% k  |# P- g& T, D: f
    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
    0 r1 B5 W# A7 g; y这个不是这么比的吧。。。
    ( _" @, L+ A/ R6 \: q) F# R2 g7 O' Y8 x7 k& O) J; k) X- A$ K; Y5 H
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    而加上内循环,光jmp和dec指令就至少多执行了6000个
    1 _; z" o4 G0 B9 M

    2 t0 ^9 p: r( G现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果循环这样跑,花不了多少时间。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    前天 02:13
  • 签到天数: 1955 天

    [LV.Master]无

    11#
    发表于 2022-9-25 02:06:44 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 02:16 编辑
    / R& T  ]* P* z, v  }/ t$ R, O
    沉宝 发表于 2022-9-25 01:48
    & ~( ?/ V6 O6 G( k! [5 B现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果 ...
    + ?: i. V3 [2 Y2 v  g
    # a  I$ I0 {7 y7 L6 i& t
    是的,兄台说的对。9 K6 x3 p( q! A6 V4 q& x, {

    . [7 Q" g5 I: z3 g/ t( H0 A其实我想说的是 真正数值计算部分和代码中其他不直接计算的overhead的比值这个事儿。/ l3 J8 y/ f/ p
    ( g! I5 A0 Z, X5 x
    雷达兄构造测试用例的时候,屏蔽掉了所有计算的部分,使得剩下的都是overhead,这样run time比较的结果就显得好像不合理了。如果把计算加回去,计算部分的run time会dominate,结果就不那么离谱了。因为不好说,所以用指令数对比的方式试图直观地说明这一点。
    ) }1 h* X2 N: l+ C, W3 `
    * B3 t- i" e$ k5 ]' e' }比如说,如果有计算,那么跑六千个循环相对于计算应该用不了多少时间。但是如果一边是什么都不做,另一边是六千个循环,那六千个循环比什么都不做慢几十倍了,就不是那么不合理了。
    7 t* ?+ Q  R8 t" I% y. h, V, L. b  w0 Z0 K
    当然也有可能像兄台说的,是优化参数的问题,但我觉得更多地是测试用例设计的不合理。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    12#
     楼主| 发表于 2022-9-25 04:47:43 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 04:49 编辑 ' e; y: |8 ?3 t0 t3 _. Z
    沉宝 发表于 2022-9-25 01:27- ^9 V1 K/ f1 S2 z% L* q
    你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子 ...
    $ H5 J2 Q) ]. z: s$ ~

    0 T& F+ T/ x& R" M7 m3 a又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差一倍,我上面这个差的太多了。& h: H1 w7 f0 [# K( s# R
    # l! G) |. S" I) {7 r5 C. a
    我已经完全懵了。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    13#
    发表于 2022-9-25 05:51:23 | 只看该作者
    雷达 发表于 2022-9-25 04:47
    $ Q( @" ]7 E1 ]1 W% Q又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...

    $ e* }- W; x& w3 D时间差一倍的结果可以接受。
    ) U2 D3 q' |/ x, d4 h, v. [* b  ]) Y# Q! w4 S- o  I
    你还是用profile工具看看吧。现在大家都主观瞎猜。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    前天 02:13
  • 签到天数: 1955 天

    [LV.Master]无

    14#
    发表于 2022-9-25 14:58:59 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 15:38 编辑 0 w( ^% d( B3 Z* E& n7 _
    雷达 发表于 2022-9-25 04:472 m& i7 y; G8 D, z! q9 E
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...

    - w+ i8 J+ a( P/ U
      v& F! c6 \5 {9 I! ]7 ^7 j) r. o! M

    % ~$ U5 W2 ^' w' X( _$ [% }, o能不能把这个也贴上来,看看和上一个有什么不同?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    15#
     楼主| 发表于 2022-9-26 01:30:03 | 只看该作者
    本帖最后由 雷达 于 2022-9-27 01:17 编辑 : H: e& |: Q& }, z7 p2 U
    数值分析 发表于 2022-9-25 14:58! @" u& F+ H% _& j1 {+ ~
    能不能把这个也贴上来,看看和上一个有什么不同?
    # z% S+ Q) b! u; c7 R* [
    理了理思路,重新做了一个测试。$ g5 p  N2 S. m6 N
    做了两个 vector 和 两个 float *, 都长 100000* v) X. T$ g1 d
    外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.+ r  ~. m4 V9 f, d9 W1 J8 I' i

    4 ]" m9 T2 x* _内循环试了4种方法,7 S- e9 R# [$ N* R7 d! C* b
    1. 直接调用 vector inner_product 247s $ u7 h3 ~0 n9 A5 F
    2. vector 循环点乘累加 237s) M, E/ W3 s1 g' V3 Y& q
    3. float * 循环点乘累加 204s
    9 u+ |, X0 r, V; B8 h* _+ g4. 空循环 100000 次 202s
    9 I+ U  ~" H8 C: A/ h. o6 W9 L, A. R4 `' G1 O; x% b
    不做内循环 200s. c, f0 G& ]" j; {9 y$ c

    ! G4 f8 J) }& C你昨天说的对,内循环本身占比是很小的,大头在其他处理。  ^" h& g4 S; `8 h
    另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
    % ?# c& H0 C% I  j9 W; Y7 Q) v' ^, N% j9 m5 |, Q
    至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
    3 I: m$ c; I' [0 k- v  W- p2 L+ o* F* @  \+ Q; h  t5 z
    (为什么下面我贴的  b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成  jj 好了,原来 方括号里的 i 是斜体标志  LOL)
    ) w8 E4 C" J. j. _
    " w7 T  Z- e. T4 R3 u; P
            std::vector < float > vec1(N);$ b  m1 Y& [' A& e; B" H+ S
            std::vector < float > vec2(N);
    0 H* j# o/ E7 W  V( e7 P: H$ E        float* b1 = new float[N];
    ' f; l' R# W1 }% C- W/ ?' U        float* b2 = new float[N];9 ~0 }9 C3 v( |! a: A
    7 m2 |9 M: p% [$ M- K
            for (int j = 0; j < 6000; j++)
    ; I8 a( K& S* f! N% {! G7 u        {/ _- _: S: k) U* Q( U
                    std::generate(vec1.begin(), vec1.end(), []() {
    . B, D" j  o1 T6 @- [! s: y                        return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;* R+ O  P/ u5 A, C
                            });2 i7 T- v' [9 {
    ' e/ n, r* C  R1 G2 k% ]
                    std::generate(vec2.begin(), vec2.end(), []() {8 R% R1 j% G" S3 N/ t1 t
                            return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;) h# C9 p8 B9 M
                            });
    % G& [7 h2 @+ y6 Y* K; s6 t" l, O5 `7 Q/ F, ]8 _8 y8 ]# k$ _8 p) K
                    for (size_t jj = 0; jj < vec1.size(); jj++)
    1 Q- W9 v- J; e' ?2 d+ M* f9 T+ t                {  x, W3 R. R8 k4 ^+ Z5 q1 @
                            b1[jj] = vec1[jj];
    ) G/ I$ f" d% w) K                }, T" X% ^% o2 S) W3 }- z. U3 A

    # y) u7 I5 ?7 z' _8 M/ E  Z                for (size_t jj = 0; jj < vec2.size(); jj++)
    * ^4 |" c6 O4 Q! Y: O* A                {
      C& z1 l2 B: [0 P  H2 A3 ?# i                        b2[jj] = vec2[jj];
    ; s/ d; E7 }- l) ]- F( J                }
    7 i3 A9 f8 R9 X8 \) f7 P) H3 J
      E- E' o* Q. t# N. z                //Method - 1  N=100000 247s  0 x1 i. J& Z. E2 U
                    //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
    9 O8 k/ f: f, V/ ]% M( U                                
    * a1 I+ {" ^1 G7 f- J/ w% Q                //Method - 2  N=100000  237s9 Y/ Z+ c& _1 }: T+ u5 A
                    /*
    7 C: D* b( _! l& Z& Z                for (int jj = 0; jj < N ; jj++)
    $ l( |$ F/ M8 d% T                {
    , o6 m; h8 Y- o2 j: n( M                        fresult += vec1[jj] * vec2[jj];% R2 N- ]' }2 J
                    }4 t3 n  c1 m& ?1 v4 b1 M
                    */
    8 _; @* I$ T. h, J3 W$ d, }* U                                
    2 @; \( {% V0 \, P/ y6 R) S                //Method - 3  N=100000 204s+ Q5 q, l! |/ j7 N6 \# ]- a
                    /*
    4 t$ ~# V/ b1 n% u% ]" I) d2 }                for (int jj = 0; jj < N; jj++)
    ' q% H1 p) r; e0 K& l                {
    2 _6 m) A0 q; [6 S, n% f$ F                        fresult += b1[jj] * b2[jj];
    : r: r8 J* D1 J7 g9 A                }& d! h6 v2 R& v* ^) D
                    */1 S8 o9 {; d1 _8 @) k7 F8 }

    0 R; L& \, X/ A. u  Y4 F3 r                //Method - 4   202s* E, V) ~. r5 l) t" Y
                    /*
    $ l6 x# k8 u1 S) q6 o5 u; Z                for (int jj = 0; jj < N; jj++)
    ; f( K/ ~8 B+ y' w                {
    8 z& ~8 k3 n2 R/ ?6 O                        
    , p9 i9 U, {) B( ?8 I                }6 r$ w3 M" O# k
                    */% g. q" z' h# p/ L/ Q( y8 B  O
                    //comment out all methods, N=100000  202s                  h( Y9 p1 \2 Q3 y% o+ K
            }% Y$ }' {4 V/ u3 M8 P5 h

    - l& U% @. ~" O% P        delete []b1;
    ) `+ l$ a2 j; l0 V/ ?8 u3 u, |        delete []b2;
    + W9 q9 T2 L1 L$ R& N, H
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    16#
    发表于 2022-9-27 00:15:38 | 只看该作者
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?
    ! ?0 n$ o) ?& V% A  E9 c( g
    6 L5 b; m6 m! M* ^你第二个试验里面的j在循环里面又重新定义了啊,你确定真的跑了6000次?
      k" Z& r: n7 X" F; c3 q$ V; k
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    17#
     楼主| 发表于 2022-9-27 01:16:03 | 只看该作者
    机器猫 发表于 2022-9-27 00:154 _) E7 S) U$ r
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?
    7 r& T$ |; G+ G/ U  R) l$ g
    ( j; f6 u+ \1 C9 \  ^你第二个试验里面的j在循环里面又重新定义 ...
    : r, G7 L4 ]1 X. c! X
    内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL% g1 k/ G- e( D# J9 R. b9 n' j- d

    # K, j( l' d- B. y) |7 O不和它较劲了,瞎耽误工夫,我已经转到 ubuntu, 也准备顺便试试 avx2 向量化。
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    18#
    发表于 2022-9-27 02:06:58 | 只看该作者
    雷达 发表于 2022-9-27 01:16
    3 q: f. [  A' [, w# d! l0 H6 `2 R" k内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL( w& j) c8 l0 L( h0 _: M

    ! ?& P' }. h$ X2 L% A4 j不和它 ...

    5 h1 i9 ~' U) X" S# M- p2 P8 n) T) `* \
    不过可以试试我说的register变量。前一个试验j是混在一堆其它变量里一起定义的,很有可能是在stack上,这样内存读写会更多,要是再碰上每次都需要加载cache就更慢了。
    " i5 j( j, x+ q1 h4 t后面一个是在循环那里定义的,说不定编译器就把它优化成register变量了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

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

    使用道具 举报

    该用户从未签到

    20#
    发表于 2022-9-27 20:29:50 | 只看该作者
    雷达 发表于 2022-9-24 23:54. |# _4 R+ a& M3 x
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    6 _6 w: c# t: P" N{
    0 W+ z2 R& o2 R5 ~        comp temp, xtimesy;
    ) s8 u& ?: [- H0 j. O
    这个code里面如果Openmp没有被注释掉的话,那么temp那个变量应该是定义在循环里面,否则线程之间会存在争夺写入那个temp的风险。1 [" A" w  W% p4 s
    内层for循环如果没有内部操作的话,编译时应该被优化掉了,和你完全注册掉整个循环是一回事。可能你的编译设置没有打开优化?
    0 h/ J# J1 d( W4 A0 d, KVS社区版没有问题,我工作用的就是社区版,设置正常的话不会比商业版差。以前游说头头用Intel Compiler,他说不想花钱,而且差不了多少,就一直用到现在。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2026-2-9 10:00 , Processed in 0.071625 second(s), 22 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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