设为首页收藏本站

爱吱声

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2022-9-24 22:54:26 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
    C++ 比 Octave 慢好多,怎么破?4 h  R! N! k. ]. U3 ?( k
    " F% N1 R* R$ `3 W. J, ~7 L4 T: ^
    自相关两层循环,内层循环涉及浮点数计算,试验了一下把内层循环内部全都 comment out 只留个壳子,  但空的内层循环本身就把速度拉下来了,看来问题并不在浮点计算。
    ' z1 Z  m, C8 f( I. Z& w5 T2 ~  i" Y* D9 {. G1 e" p& J/ f
    速度优化问题真的很有意思啊。$ ?. D6 P$ l1 h4 C6 D- J/ o
    - O4 ~, s& H7 H- @' H2 W/ c
    欢迎大家继续讨论

    评分

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

    查看全部评分

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

    [LV.Master]无

    沙发
    发表于 2022-9-24 23:04:16 | 只看该作者
    拉下来?拉多少?1 L* |/ E- d& U- u. J7 h- E
    把代码贴上来看看?
    , Q& X3 G0 \& X& c
    . ~) C7 c$ ]( w& \8 l; l难道分支预测不准破坏流水线执行?不该啊。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    板凳
    发表于 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 编辑 % L6 W- N% N/ ?; i& ~9 O9 B5 |
    数值分析 发表于 2022-9-24 23:04
    4 a, B) E7 W# C. d! Z拉下来?拉多少?
    ! K) t7 U! l+ H7 c# p5 v  D把代码贴上来看看?

    / R0 G. d& N0 I" e0 J( \4 Q2 }3 R" J' q: a
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)! [" X; G6 X4 {. i6 P" K
    {/ `  I/ Y  Y( r( r4 Z; p
            comp temp, xtimesy;
    0 X0 r/ p5 P/ r4 }& y- j        xtimesy.re = 0;
    , z  b& D, X% [0 E& e5 s4 A        xtimesy.im = 0;0 s7 C% K& ^5 B4 O
            int j0 = lenB - 1;, Z! t+ i" z9 [1 ]: d
            int    i, j, i1, reali;
    ' p) [# k* K* v7 r' I2 n! R, Y        if (lenA % 2 == 1)- v. e+ T& {; s* j
                    reali = lenA + 1;( [, D4 H0 C, k9 Z$ e
            else
    ) l6 D6 t7 a; c7 B+ A, u                reali = lenA;
    4 t0 O" O% Z) R        reali /= 2;, j0 y; t% L4 n3 T. p6 U
      x- q8 |: m! W/ m- [9 e# V/ X
            int nconv = reali + lenB;
    ) }6 s! G3 P8 V& N' o" E& ?8 i        //#pragma omp parallel for7 `1 k; T4 \7 @5 T' F
            for (i = reali; i < nconv; i++)
    4 x1 G' v5 m+ `% Q7 o( o' p/ V        {, n7 D7 ^1 m4 p+ j, N" F* F7 m) E
                    temp.re = 0;8 `4 @! e4 w6 }! m, P4 l( R) `
                    temp.im = 0;. e0 q; {( N# j; w2 z: g
                    i1 = i;! V$ O. X/ k* J1 P$ P
                    for (j = j0; j >= 0; j--)$ F. R( z/ @8 x8 b% u
                    {$ K0 s& ^5 b( r
                            /* floating date operation */
    . @7 U) x2 \4 ~3 b7 i2 E9 X! h                }
    9 P$ h1 X3 F4 V/ ]+ ?$ L4 d
            }$ w7 A3 g8 S2 v8 K
    }
    $ P, Q: ]* |6 J
    " e8 s- _% h6 w4 g, m1 jxcorr函数代码如上,comp是复数struct, 做过长度为11、19两个矢量的测试,和octave结果完全一样
    6 V0 ]/ i/ K. M# F# X
    * F6 R4 Q: W3 h3 L$ A" i  W/ U红色部分是内循环,现在其内部操作都comment out 了, j0大概是 6000。
    1 o2 }2 o0 G9 _7 X# u现在call xcorr 100次,耗时78s.
    " Q+ J  t. ?: [& v( f- k
    ; l( g2 B) O! R! `" i# j* C如果把红色部分内循环本身完全comment out, call xcorr 1000次,耗时 <1s.
    ( K! m( D6 h6 F6 p6 ]! x
    ; y& ]( B- l( s% C$ {6 k
    回复 支持 反对

    使用道具 举报

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

    [LV.10]大乘

    6#
     楼主| 发表于 2022-9-25 00:17:17 | 只看该作者
    风雨无阻 发表于 2022-9-24 23:33( V" S, G( C" M/ Z# A# v/ v4 o
    Maybe Debug mode?

    - t4 s) _! i3 U6 {2 B
    . D8 s, v) p( d5 z不应该,看我上面的回复。
    , y3 w+ F/ c( L6 q! _3 T5 s, f& R
    6 F* T, E" R8 g+ T我更怀疑是 VS 社区版的问题
    回复 支持 反对

    使用道具 举报

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

    [LV.Master]无

    7#
    发表于 2022-9-25 00:20:10 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 00:24 编辑
      r2 u0 l1 `4 s" w5 ?6 B! R
    雷达 发表于 2022-9-24 23:54$ r6 {! y) a$ x2 M6 ~+ C- D3 e! {
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)$ p, U9 u; L% B+ m/ x" Z  B
    {3 F: R% |" r9 g4 _
            comp temp, xtimesy;

    - {9 H3 q" ?: R/ _5 l2 y7 D
    # S) E- L# V- g4 @这个不是这么比的吧。。。8 z* e" z! s8 i7 Z3 o

    , O3 L( R; F: \! A% D1 ?您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    - V" S/ }" p  M
    ! D- g  s0 t* H. V# L  t5 \而加上内循环,光jmp和dec指令就至少多执行了6000个,慢个几十倍不是正常的么?
    回复 支持 反对

    使用道具 举报

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

    [LV.10]大乘

    8#
     楼主| 发表于 2022-9-25 00:46:56 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 01:09 编辑
    / Z/ \6 j/ V2 ?! x) |- L: ~* W
    数值分析 发表于 2022-9-25 00:20
    . i9 l: s/ O+ C3 S( g  V& x这个不是这么比的吧。。。4 P/ K" U3 v) \* `2 I. k; O
    9 o0 s& Z# S. W) q6 }7 A3 F9 X
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。

    5 N5 m& z' F# O5 x7 L3 F' L; K, A: O: q! c% W
    有道理。7 S/ O$ t6 i0 U
    所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,记得 numeric 库里有算向量内积的,我回头试试。  m9 m( z, Y' w6 x. T2 }& q

    0 V1 c6 I  {! K. H* G. V& ^我先尝试尽量用标准库,一个小程序,不想搞得太复杂。多谢了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    9#
    发表于 2022-9-25 01:27:53 | 只看该作者
    雷达 发表于 2022-9-25 00:46
    , }# w% _! H0 n# s5 j  B% R6 O: `有道理。
    3 `1 J( \4 s: b& ~所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,这大 ...
    , T9 Y& z; o8 V8 z( q
    你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子,把循环本身翻译成机器指令loop或dec/jnz,两者速度上会差很多4 ^& s6 n! l% C) h5 ^+ ?
    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, B3 v; y9 L- w0 {& D% b1 W- K+ d
    这个不是这么比的吧。。。
    # c7 S2 n& m1 T' n/ F) q; T1 W/ b, D1 S
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    而加上内循环,光jmp和dec指令就至少多执行了6000个

    0 j7 `3 i+ [: _  C$ w* z. D! f% h& t0 A
    现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果循环这样跑,花不了多少时间。
    回复 支持 反对

    使用道具 举报

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

    [LV.Master]无

    11#
    发表于 2022-9-25 02:06:44 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 02:16 编辑 " j, h, d9 Q, b2 ~
    沉宝 发表于 2022-9-25 01:485 q$ l, {+ b9 V; v2 t
    现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果 ...

    + Q6 d8 B, i7 o
    4 \: G) u8 J4 @' z9 T5 l* u是的,兄台说的对。
    . d, e4 U1 B4 D' ]) j5 D; H
    . q& N  Q# O3 h其实我想说的是 真正数值计算部分和代码中其他不直接计算的overhead的比值这个事儿。
    & z# Z5 g/ T3 Q, |* r* W' S% V. B% ^
    雷达兄构造测试用例的时候,屏蔽掉了所有计算的部分,使得剩下的都是overhead,这样run time比较的结果就显得好像不合理了。如果把计算加回去,计算部分的run time会dominate,结果就不那么离谱了。因为不好说,所以用指令数对比的方式试图直观地说明这一点。
    1 P  |, C. h% V: U$ h# U! Q8 h& ^  N$ C; ~( K# y' [! I
    比如说,如果有计算,那么跑六千个循环相对于计算应该用不了多少时间。但是如果一边是什么都不做,另一边是六千个循环,那六千个循环比什么都不做慢几十倍了,就不是那么不合理了。4 J1 B! v4 ?9 ^8 ^3 t
    8 y; a0 ~) f$ n. f
    当然也有可能像兄台说的,是优化参数的问题,但我觉得更多地是测试用例设计的不合理。
    回复 支持 反对

    使用道具 举报

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

    [LV.10]大乘

    12#
     楼主| 发表于 2022-9-25 04:47:43 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 04:49 编辑
    7 T: F; B- L4 G/ u( G% J* \, |- y& n
    沉宝 发表于 2022-9-25 01:27
    " }* z" f* `- w0 i- v6 ?你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子 ...
    % @: l5 p+ f/ s; u$ g
    $ f# w: m/ M7 Y6 _4 m1 `  j
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差一倍,我上面这个差的太多了。
    + Q7 {' M* d& ?, A- T& D2 h+ ^
    8 d% W! e, W$ i( C4 C( ~4 j% x我已经完全懵了。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    13#
    发表于 2022-9-25 05:51:23 | 只看该作者
    雷达 发表于 2022-9-25 04:47
    - Z. |& L- Z' R$ R% A又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...

    4 w" N4 Q, \0 S6 ~时间差一倍的结果可以接受。
    " ?$ @3 ^5 f" O2 D( J) i
    : f2 f7 k  R: k6 n/ r9 C2 L; v- G你还是用profile工具看看吧。现在大家都主观瞎猜。
    回复 支持 反对

    使用道具 举报

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

    [LV.Master]无

    14#
    发表于 2022-9-25 14:58:59 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 15:38 编辑
    + ^$ |6 [6 g: n
    雷达 发表于 2022-9-25 04:47! w+ P8 Q! }' p% M* P) I; l' {
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...
    6 r( P3 _5 j+ o/ G
    / _: M3 |& L1 D4 c7 i9 y& z5 b9 q
    ) ~4 |5 F# b/ u: c: d

    4 S( S3 w4 p& G, q能不能把这个也贴上来,看看和上一个有什么不同?
    回复 支持 反对

    使用道具 举报

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

    [LV.10]大乘

    15#
     楼主| 发表于 2022-9-26 01:30:03 | 只看该作者
    本帖最后由 雷达 于 2022-9-27 01:17 编辑 . ]. a1 g7 K' [
    数值分析 发表于 2022-9-25 14:58
    ( P. h- J& `7 K, F. `; e能不能把这个也贴上来,看看和上一个有什么不同?

    % l+ i) Q6 q: s, Q& h) p8 k# F理了理思路,重新做了一个测试。
    0 C4 W* Q8 @# [5 ^) o做了两个 vector 和 两个 float *, 都长 100000
    / T0 P8 z2 h7 J; t外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
    % ^6 c6 V& ]: D% L% i( |) B
    1 g# S  ?3 W2 a( F7 ]9 k, c) |- M5 G内循环试了4种方法,
    & g- W3 O8 @& n& `1. 直接调用 vector inner_product 247s
    5 y9 K5 p$ f, n+ Z, ?1 _2. vector 循环点乘累加 237s
    ) E4 b) E7 q' F# e3. float * 循环点乘累加 204s# R4 p' u! U/ ]) T( ?, W% n
    4. 空循环 100000 次 202s: M1 D% d4 Y. q0 G
    . W/ w" z6 y, ^; n1 _! Z5 U( h- b
    不做内循环 200s
    + S1 W" v, Y7 |9 d2 N# h; ~  \! I& Y# z3 @- u# |+ h
    你昨天说的对,内循环本身占比是很小的,大头在其他处理。( ?, B* y+ X" M7 k2 k% s& ^
    另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。5 s! ?! x7 r( l) v, b9 B

    & d& y6 v. v; ^7 S4 y: X至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
    ! P7 S0 k1 c: w) n0 l& M( z; P$ \2 s0 L
    (为什么下面我贴的  b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成  jj 好了,原来 方括号里的 i 是斜体标志  LOL)! i1 h* x4 q. A7 f: E

      I- i6 b* [9 X( h6 ^5 d% l4 C
            std::vector < float > vec1(N);$ \- \. F* @( D+ |" i
            std::vector < float > vec2(N);
    6 z6 {8 @6 i& f- \1 F" z# M% }        float* b1 = new float[N];
    * ]& V- L( W# n! m& b* }  i# O        float* b2 = new float[N];
    8 V3 p, l- t6 a! R) f1 S8 R$ D" H" n1 r# P0 g8 a: U
            for (int j = 0; j < 6000; j++). w1 ?4 \, L/ z4 p. H
            {
    . j3 \, |+ a# P# D3 m                std::generate(vec1.begin(), vec1.end(), []() {
    - }; C* d% g3 Q9 T; ?# v+ C                        return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;+ k. [: C! B, y' O  r
                            });# e7 M2 l3 w1 Q, v" g

    ) Q8 Z2 y6 O# q# z                std::generate(vec2.begin(), vec2.end(), []() {) V6 ^4 y' r: ~4 g- C2 C0 S2 F- T# i
                            return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
    & Z& c+ s5 A& ~/ |! D, a# f* n                        });
    $ w6 O" V1 x" Z. v) v! d5 @' N5 c! J' j1 T0 c0 e% s
                    for (size_t jj = 0; jj < vec1.size(); jj++)% b9 ^, ^( R2 ]7 y- g
                    {
    6 {( j; M& Q1 F1 s                        b1[jj] = vec1[jj];
    # b  b2 o( B/ N' y# T' f" c                }
    7 L6 y7 T/ S7 s6 d1 e# y- w8 ~$ S: ?9 g% _" p+ a5 F. j- Y' o
                    for (size_t jj = 0; jj < vec2.size(); jj++)
    . t* X. E& [% Y: l" `& N3 K                {4 k; \8 \& C4 h. i) H3 e8 }% O
                            b2[jj] = vec2[jj];! z2 Q4 _6 P" y$ R( v# X7 L( d/ C& D
                    }
    9 E0 @9 M$ _0 K6 ^; S! k
    # I2 w, f: O9 P5 D  I7 f) G                //Method - 1  N=100000 247s  + ~! \0 s) c9 v5 K- ^+ [4 O
                    //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);* x' d9 D! v7 m. W
                                    9 E" X- G4 u. q6 G
                    //Method - 2  N=100000  237s. S6 W* M% [4 w. R
                    /*
    8 b5 q$ X$ R, E9 ?" y                for (int jj = 0; jj < N ; jj++)  l- B4 e% m; V9 o% v' r6 ?7 f
                    {# ~( m$ F6 U# a* x
                            fresult += vec1[jj] * vec2[jj];8 y' f0 }2 J' b7 E! K) }8 I
                    }) _4 P( U. H2 H/ Y7 ?
                    */. j7 |1 |9 \) O) k1 q$ [
                                    4 j/ j; Z, x2 l) a( s
                    //Method - 3  N=100000 204s0 k% ^" h/ `* W2 [3 q: R
                    /*
    ) [$ q$ [( d" i& y                for (int jj = 0; jj < N; jj++)
    % E7 e& E# f  |% |                {8 @$ D8 d5 ^6 W( D( }2 ~/ V
                            fresult += b1[jj] * b2[jj];
    8 C, D: y6 R8 G                }
    2 L% o6 ]. }' ^* X" Q                */
    9 I2 L/ p- p9 [3 _! L0 p" J* h" n9 N- e5 t! D4 {
                    //Method - 4   202s1 }8 l. Y- T" s
                    /*
    . X! U/ [6 H' T# {4 j/ s6 T! ^9 m                for (int jj = 0; jj < N; jj++); v" ~( {. Q' B  m6 `
                    {
    + x- \) }3 I6 ]                        , i# |7 F$ b" s$ P& t" v
                    }% Y( _* x- T0 S5 i2 `: B
                    */
    & Z4 M4 a1 L" z) T                //comment out all methods, N=100000  202s                8 i5 Y6 L, R4 |1 ^$ J, x
            }
    ; |1 \+ G. Z' ?8 D' T$ n) i* x! @( h; h* L+ i
            delete []b1;
    , m; E! m( }5 F- ~6 m        delete []b2;

    8 i$ t) Q1 \5 [' t( Y  |
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    16#
    发表于 2022-9-27 00:15:38 | 只看该作者
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?. S1 Z1 r. S4 y% s

    : I$ _& w+ t' e你第二个试验里面的j在循环里面又重新定义了啊,你确定真的跑了6000次?
    1 `1 @% v4 F' a5 S- W8 U0 a: Q( X% A
    回复 支持 反对

    使用道具 举报

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

    [LV.10]大乘

    17#
     楼主| 发表于 2022-9-27 01:16:03 | 只看该作者
    机器猫 发表于 2022-9-27 00:15
    # z) b* o# x- |  }$ n; I* G瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?
    0 s5 g8 F* ~, \
    , @' D7 o0 B9 N0 @4 Y" D你第二个试验里面的j在循环里面又重新定义 ...

    + k. F4 C2 Z/ A$ i& s内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL. i7 E1 \8 \) ?6 D; w

    ; N) Q$ J, z0 k1 c1 j不和它较劲了,瞎耽误工夫,我已经转到 ubuntu, 也准备顺便试试 avx2 向量化。
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    18#
    发表于 2022-9-27 02:06:58 | 只看该作者
    雷达 发表于 2022-9-27 01:16; g. D& g- t! E6 K) \
    内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL
    + O1 c0 Y/ ^6 `
    * h: Y6 t4 M9 ?( D# R( c2 x不和它 ...

    + }; S5 a# O" l/ Q
    / j# `2 F" t$ O1 V# C1 @# j1 p不过可以试试我说的register变量。前一个试验j是混在一堆其它变量里一起定义的,很有可能是在stack上,这样内存读写会更多,要是再碰上每次都需要加载cache就更慢了。& M8 M/ ^# J3 c4 [
    后面一个是在循环那里定义的,说不定编译器就把它优化成register变量了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

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

    使用道具 举报

    该用户从未签到

    20#
    发表于 2022-9-27 20:29:50 | 只看该作者
    雷达 发表于 2022-9-24 23:54+ Q. _. a7 i; `! h9 q6 Y& k
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
      g  ~1 w0 k+ N; |! b6 M! Q- A{
    ( h$ A* Y/ h8 V$ Y) _! h0 b: @        comp temp, xtimesy;

    8 E: `" F6 X- {! s' ?3 q6 r' a2 A: Y5 q这个code里面如果Openmp没有被注释掉的话,那么temp那个变量应该是定义在循环里面,否则线程之间会存在争夺写入那个temp的风险。
    # ?- Z! v; f3 y: u2 F3 _& s内层for循环如果没有内部操作的话,编译时应该被优化掉了,和你完全注册掉整个循环是一回事。可能你的编译设置没有打开优化?4 e. o1 C0 J7 K% ~; ]# G
    VS社区版没有问题,我工作用的就是社区版,设置正常的话不会比商业版差。以前游说头头用Intel Compiler,他说不想花钱,而且差不了多少,就一直用到现在。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2024-5-4 18:04 , Processed in 0.045771 second(s), 19 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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