设为首页收藏本站

爱吱声

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

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2022-9-24 22:54:26 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
    C++ 比 Octave 慢好多,怎么破?: h4 o1 s: Z: [6 }  {
    ' o& z& z3 N1 V5 l. w. {
    自相关两层循环,内层循环涉及浮点数计算,试验了一下把内层循环内部全都 comment out 只留个壳子,  但空的内层循环本身就把速度拉下来了,看来问题并不在浮点计算。
    9 S( ^' y) y( g+ L" [. q% S& m: o* B$ ^  |0 e- |, R
    速度优化问题真的很有意思啊。3 w" f/ o2 E) `; `+ k5 f+ q& f" G

    & D% C& ~$ g, \欢迎大家继续讨论

    评分

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

    查看全部评分

  • TA的每日心情
    开心
    2026-2-7 02:13
  • 签到天数: 1955 天

    [LV.Master]无

    沙发
    发表于 2022-9-24 23:04:16 | 只看该作者
    拉下来?拉多少?) ^9 l0 t1 S* J/ f! g; m
    把代码贴上来看看?
    3 c1 a( H# z9 e$ a5 @7 ~
    ! ~' w/ U. P2 x7 I. Z4 A难道分支预测不准破坏流水线执行?不该啊。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

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

    使用道具 举报

  • TA的每日心情
    开心
    6 天前
  • 签到天数: 126 天

    [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 编辑
    ! T( v! m" a9 _4 a2 h$ z2 i
    数值分析 发表于 2022-9-24 23:04
    : d% ^( _0 p* q; J! }8 [7 d3 ~拉下来?拉多少?# q" q* J1 A$ X' B) D0 J0 G5 S
    把代码贴上来看看?
    + U7 m4 v5 X+ O, t  C/ }4 Q  b, L

    2 n' H+ }' x( V# h4 B2 Ovoid xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    " ]3 d( j4 E- O& O{
    # T4 d1 @! S7 R5 i* ?        comp temp, xtimesy;2 t% J% v$ U) j! N! p; W# P
            xtimesy.re = 0;
    3 z& l4 P& f" i9 g& l9 K6 Z        xtimesy.im = 0;
    8 b& |7 m3 z' Z0 C% N        int j0 = lenB - 1;1 _. ?2 {% I+ |  d2 {+ ^1 g. P3 O
            int    i, j, i1, reali;- E! u( k* k1 k' p2 U
            if (lenA % 2 == 1)
    / G0 k; P% B/ s+ N9 u                reali = lenA + 1;# ]) r& d8 K& F3 ^/ b
            else
    ) |' _2 o. G, q7 z                reali = lenA;
    1 |3 H& U' C' O6 I7 ?. C) ?        reali /= 2;) v0 m& g. c5 s) V4 g: c
    7 z' V  t+ h" U6 B& T% s
            int nconv = reali + lenB;
    " O. i; |9 z6 _& G6 c) d        //#pragma omp parallel for
    ) n6 l' K) g; [6 S. P, [8 w        for (i = reali; i < nconv; i++)) h% C2 [3 k& H( w/ {* f* d
            {
    * ^7 y( J; n3 T0 r. ^# S& E# r                temp.re = 0;
    # F5 D5 ^) |0 t# D                temp.im = 0;) |: f# F1 |6 f6 Z% k6 m, n5 L
                    i1 = i;
    $ P/ y/ u, r$ r+ S2 T                for (j = j0; j >= 0; j--)( l4 x' d0 |- H7 W- x" w
                    {
    . h7 k/ l3 l1 U+ w: G                        /* floating date operation */
    ! B. @/ G* Y+ k* Q; ]/ v+ F                }

    5 V( ~  i% g' f' J        }
    / K" G! M2 L# s' e% z}( W6 d0 E7 o  }+ X, s
    5 p# X. {/ v. s% i- R2 n6 J" Y
    xcorr函数代码如上,comp是复数struct, 做过长度为11、19两个矢量的测试,和octave结果完全一样  A  g; p+ L' Z0 l0 U9 A' T# J5 o( |

      d9 L9 M4 U6 Z: g+ U红色部分是内循环,现在其内部操作都comment out 了, j0大概是 6000。
    $ P6 \' f$ n: ^0 T) h+ p现在call xcorr 100次,耗时78s.6 W+ ^) Q  O/ k' L. \! N, f9 C
    7 Y0 J$ E4 P" P! m
    如果把红色部分内循环本身完全comment out, call xcorr 1000次,耗时 <1s.
    ; l, S! X- s5 u5 E( j
      {& i# T1 S0 I' p1 ]
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    6#
     楼主| 发表于 2022-9-25 00:17:17 | 只看该作者
    风雨无阻 发表于 2022-9-24 23:336 k6 u& V. q6 G# M2 C7 v2 v4 y
    Maybe Debug mode?
    " W$ b7 s. H- r, w: C2 A& [

    ( X$ @2 H: i3 y! ~7 _不应该,看我上面的回复。
    # Q" g0 U  c/ q7 t) o7 K0 O
    5 Q% }3 R$ c" c, U2 g1 p我更怀疑是 VS 社区版的问题
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2026-2-7 02:13
  • 签到天数: 1955 天

    [LV.Master]无

    7#
    发表于 2022-9-25 00:20:10 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 00:24 编辑 ; c5 R& d1 S) L- ]; T; I
    雷达 发表于 2022-9-24 23:54
    ! f% l. Z4 }% }! v; D7 L, ?: x4 }void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    ' z+ }4 v- |; l* F( R{* M6 z% F! ~5 y. d- b+ W
            comp temp, xtimesy;
    " C2 y  f- R8 S) [/ Z: f- {

    0 Y) V4 j4 v) Z  M0 A1 V这个不是这么比的吧。。。9 l, E+ c( l7 }* T
    * g) R7 S  N# l6 N9 x
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。6 V7 k& T# j1 A+ \

    * j* X7 M9 a% J4 W7 I3 t' U# ?而加上内循环,光jmp和dec指令就至少多执行了6000个,慢个几十倍不是正常的么?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    8#
     楼主| 发表于 2022-9-25 00:46:56 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 01:09 编辑
    7 m/ H9 D) Y: I8 `
    数值分析 发表于 2022-9-25 00:20
    : k9 ^1 }* h0 A4 j7 S- t/ W& H% H3 P这个不是这么比的吧。。。9 ~) {& s# C) h9 T6 I, u1 o

    2 I6 F* S8 a5 Y3 |您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    3 D* P* V: P! ?: j  {
    6 a% T" {/ D# o7 E* ?, M+ }
    有道理。
    7 |1 g& Z7 }: B/ ?% I3 V所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,记得 numeric 库里有算向量内积的,我回头试试。
      z* V1 U  ?5 c) J0 k2 K  Y9 g) {
    " ?3 [9 l- z% i( ?( h# j& Z我先尝试尽量用标准库,一个小程序,不想搞得太复杂。多谢了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    9#
    发表于 2022-9-25 01:27:53 | 只看该作者
    雷达 发表于 2022-9-25 00:46
    2 g' ]3 R& ^! r/ F! |5 ?( y7 J  J  S) J有道理。  W. y2 G1 s, X( k# ]; M! c  j
    所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,这大 ...
    5 U, y+ P; ]# y+ n+ n- Q
    你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子,把循环本身翻译成机器指令loop或dec/jnz,两者速度上会差很多
    1 v! \! ?+ ?% R' X1 NWhy 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 o1 ~* [4 O5 r( s/ x这个不是这么比的吧。。。" H& Y+ i2 p' I  L) v- K. K) x
    6 S0 }9 I' r9 d7 ~! K7 R
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    而加上内循环,光jmp和dec指令就至少多执行了6000个
    + I4 ^. h; [6 ^0 g; ]4 {
    * k1 [* x# {( [+ _$ s6 u9 {- ^' A
    现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果循环这样跑,花不了多少时间。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2026-2-7 02:13
  • 签到天数: 1955 天

    [LV.Master]无

    11#
    发表于 2022-9-25 02:06:44 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 02:16 编辑
    - H/ A9 ?; l! Q0 |$ K9 _7 q
    沉宝 发表于 2022-9-25 01:48
    ' J- K4 n& Y, E+ B1 u: j现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果 ...
    . f$ X% z5 e7 \; c5 N4 W# V. j. G% c
    ! i4 W+ i7 B$ H. l4 x! b9 M. T
    是的,兄台说的对。
    5 Q  R, V3 {2 z# M  h* r* z' {, t: M$ B/ B; O
    其实我想说的是 真正数值计算部分和代码中其他不直接计算的overhead的比值这个事儿。% Q1 V, _4 K5 {) E1 ]
    1 E+ q2 p% \) `. `
    雷达兄构造测试用例的时候,屏蔽掉了所有计算的部分,使得剩下的都是overhead,这样run time比较的结果就显得好像不合理了。如果把计算加回去,计算部分的run time会dominate,结果就不那么离谱了。因为不好说,所以用指令数对比的方式试图直观地说明这一点。
    # V6 `" e( E1 V; _9 d+ q, g5 F" V! _
    比如说,如果有计算,那么跑六千个循环相对于计算应该用不了多少时间。但是如果一边是什么都不做,另一边是六千个循环,那六千个循环比什么都不做慢几十倍了,就不是那么不合理了。# A' D- F2 q. K* x" n* G0 g( A
    3 C( Q" {- x  \' P/ I1 M; o
    当然也有可能像兄台说的,是优化参数的问题,但我觉得更多地是测试用例设计的不合理。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    12#
     楼主| 发表于 2022-9-25 04:47:43 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 04:49 编辑 ( t6 Y- H0 b: U/ j0 H/ c
    沉宝 发表于 2022-9-25 01:27- y9 W( D" q9 N1 ]2 C) T
    你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子 ...
    % B2 I% T! K& f) N* R" G

    # I; }* B* b: y' o0 `+ x又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差一倍,我上面这个差的太多了。
    ' ~, R: n# P7 ?  ?" x
    ) w7 |: F! O: e8 C5 H% f我已经完全懵了。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    13#
    发表于 2022-9-25 05:51:23 | 只看该作者
    雷达 发表于 2022-9-25 04:47
    # l& d& y" {: M( ^又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...

    & l) P3 t7 p) |" G时间差一倍的结果可以接受。* V' a# J, h/ q+ j0 w; @
    2 N! B$ n" w# x3 V0 d4 `' t
    你还是用profile工具看看吧。现在大家都主观瞎猜。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2026-2-7 02:13
  • 签到天数: 1955 天

    [LV.Master]无

    14#
    发表于 2022-9-25 14:58:59 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 15:38 编辑 . }% N- P( f2 M  `" W2 |8 _) E: M% A" f
    雷达 发表于 2022-9-25 04:47+ e' w% A7 R% r7 d, U7 _
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...

    4 G. E7 `( E& U! b$ ^/ w* a- l5 }' a* M0 m/ G# v, D

    ! @  o: C2 ^2 K- G# @' f; y& N( g1 ^
    能不能把这个也贴上来,看看和上一个有什么不同?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    15#
     楼主| 发表于 2022-9-26 01:30:03 | 只看该作者
    本帖最后由 雷达 于 2022-9-27 01:17 编辑
    # k% h1 i6 M# z7 S- d: G6 N! _
    数值分析 发表于 2022-9-25 14:58) y8 z+ R$ O/ x& O
    能不能把这个也贴上来,看看和上一个有什么不同?

    7 z9 Q# D7 r0 }* |% c理了理思路,重新做了一个测试。6 @- |6 U1 [: ^, Q' i+ U& w
    做了两个 vector 和 两个 float *, 都长 100000* }* V% `* N" {5 z
    外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
    5 e$ B- t1 u; F* y9 h: o! n: e/ @" [: B$ l. J2 ~
    内循环试了4种方法,
      h8 ]3 ^- K" R7 i1. 直接调用 vector inner_product 247s " Y) @% E  G/ o0 x9 P3 x) x
    2. vector 循环点乘累加 237s  c% R' c  I, I) P/ l. F
    3. float * 循环点乘累加 204s5 _+ O7 u" t7 _# E$ h: k
    4. 空循环 100000 次 202s
    ; C6 W$ i/ y6 D9 y, R; F' w3 ~8 E
    , }. `5 e+ J5 [- [  a% q" T不做内循环 200s
    , y* J+ \+ Y! s  w" I
    ( M& W) m0 X7 c5 D你昨天说的对,内循环本身占比是很小的,大头在其他处理。8 R- N5 ]. J4 T! X7 s
    另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
    5 y% f' o' p, ~0 w% A
    / q4 m; Z* {' a! i' k8 G, x至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
    - Q- \; |: |- U4 [/ I- w* e9 a
    $ V2 G0 Q' m& _& F0 q(为什么下面我贴的  b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成  jj 好了,原来 方括号里的 i 是斜体标志  LOL)0 _& z" k  k: T7 c7 T

    1 Z! Z3 d2 {, z4 u  ~
            std::vector < float > vec1(N);2 L4 e) y/ B; f( s. Z7 ?$ D
            std::vector < float > vec2(N);4 d9 r$ ^$ ]% r9 S7 s
            float* b1 = new float[N];: P% A4 y, G1 c
            float* b2 = new float[N];
    + P8 g5 X& q2 S$ ]
    - Z. F6 D! G: g1 u7 Q) w        for (int j = 0; j < 6000; j++)/ e. p* W, l/ H/ X% F- K
            {
    % K: {- V1 o" S                std::generate(vec1.begin(), vec1.end(), []() {$ ]# W3 O' Z9 w/ V* {1 _: I, Q
                            return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;) B, W# _, Y' u
                            });
    $ c2 G5 A! ~1 V, {7 Z( }2 Y+ {8 E1 U9 N$ W1 h( R
                    std::generate(vec2.begin(), vec2.end(), []() {+ X( }+ C1 W8 Z! j/ Y' _
                            return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
    ( @# C3 t8 |1 D                        });
    5 [  x4 Y( v; |$ C
    0 \  h9 D: \6 s9 M                for (size_t jj = 0; jj < vec1.size(); jj++)
    ; U# K" u' }( G# [                {$ v  v( F. E: k7 k" I: G
                            b1[jj] = vec1[jj];, v' @, ^8 ~( N  m+ x
                    }* d+ r1 v* ^9 |! j( ]5 ~- G( x

    9 W, B- s. |" O2 q6 U7 M- o3 l                for (size_t jj = 0; jj < vec2.size(); jj++)
    - s3 ~1 ^( x0 L4 O- I1 [- i                {9 p% x2 }+ y. n7 s
                            b2[jj] = vec2[jj];( ^  c( o! B6 q) Y
                    }) u$ j' G% }4 i2 A: m/ a# |
    ' K; ~' z1 }) ^8 A. ^+ e
                    //Method - 1  N=100000 247s  
    7 i& y/ d/ u' v, p5 O. \                //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
    0 `8 K7 p1 Q7 {7 L                                
    : N% J' y$ v& C+ F' C3 S& P/ n1 g                //Method - 2  N=100000  237s2 ~9 l0 f% c- e- o$ f; V
                    /*+ z. M5 a3 ]9 H5 s2 h
                    for (int jj = 0; jj < N ; jj++)
    * h! x& i0 Y4 z6 p, O8 U' S                {
    5 h. r" |  O) D- J8 s1 _3 w7 d5 I: A                        fresult += vec1[jj] * vec2[jj];! i, s5 e, A# z4 ?/ S
                    }2 e) h  v$ E+ u+ g; p% q
                    */$ c' r4 v! r. n8 o2 M9 ~
                                    3 k- H2 s: m: V& |! J
                    //Method - 3  N=100000 204s
    2 Q/ g% ]! G( W2 i( n' }                /*
    . n4 [' o8 w5 ?4 ^                for (int jj = 0; jj < N; jj++)# x) S6 r- ~3 T- [! }
                    {
    1 j- v4 t9 e! ?. e8 u* L                        fresult += b1[jj] * b2[jj];5 Y  ~4 a- |  \, N
                    }
    8 W/ }; ]9 r1 V3 a8 d3 R                */
    4 K  B7 m; A: J
    : P( ^9 L2 r) {8 B2 M                //Method - 4   202s
    2 c2 ~: M9 }9 T! ^* u$ `' s                /*' H4 u% i5 U) F1 g: r
                    for (int jj = 0; jj < N; jj++)
    3 G4 Z( X9 }: Z4 i* S" K+ a* @8 \                {
    % w) d3 H/ M0 @2 V                        5 w2 o% B0 X2 E
                    }" B! _, O/ S0 I* d3 q) I  P
                    */, f. H  B, o* P
                    //comment out all methods, N=100000  202s                # [8 i5 v! U8 d  C) @! ]; c; x
            }/ Y2 z/ Q5 K2 _

    ' Z4 c' b/ ]3 S9 I+ A/ o- c        delete []b1;  h. Z! Q9 g+ X3 s. `! {
            delete []b2;
    . U3 I* r4 s0 _& c! R1 U! h# Z8 y' |
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    16#
    发表于 2022-9-27 00:15:38 | 只看该作者
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?& k- O2 M8 r, s' F; ?* z
    : R$ m% Z2 T! U1 r
    你第二个试验里面的j在循环里面又重新定义了啊,你确定真的跑了6000次?, N3 Y. R# r. X; ?2 g# `% s( n9 u
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    17#
     楼主| 发表于 2022-9-27 01:16:03 | 只看该作者
    机器猫 发表于 2022-9-27 00:15
    ( y+ U8 p, @( l, v7 Y0 }  E瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?
    ! ?, _& C8 ~8 f2 N7 Q  e
    & C3 B2 ~! D. p, ]5 ?! _你第二个试验里面的j在循环里面又重新定义 ...

    6 p' i; G( H) N8 C  b内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL
    $ W8 F8 X) ?1 S+ e- V' E0 _- }2 y" x' B; I
    不和它较劲了,瞎耽误工夫,我已经转到 ubuntu, 也准备顺便试试 avx2 向量化。
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    18#
    发表于 2022-9-27 02:06:58 | 只看该作者
    雷达 发表于 2022-9-27 01:160 j0 S  m- c" M0 U/ Y' O
    内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL. ?! t  N. m. d. B- b. ]

    7 S2 o2 g9 B3 T! T. p" F不和它 ...

    , I8 F# t) n8 U& f
    6 m0 _& O2 M: g  r- \& i不过可以试试我说的register变量。前一个试验j是混在一堆其它变量里一起定义的,很有可能是在stack上,这样内存读写会更多,要是再碰上每次都需要加载cache就更慢了。+ \, ?3 e' k- Z4 X6 v! ?: }
    后面一个是在循环那里定义的,说不定编译器就把它优化成register变量了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

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

    使用道具 举报

    该用户从未签到

    20#
    发表于 2022-9-27 20:29:50 | 只看该作者
    雷达 发表于 2022-9-24 23:54
    + m; i8 d  i* i' Q4 e. D+ nvoid xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB); U9 d8 I+ P* w1 E. ]8 ]# |3 G
    {
    + G; M$ y% D& c. {5 D4 [: l. O. ?        comp temp, xtimesy;
    0 T; ^2 W/ [! C- A1 w+ i/ Y1 t
    这个code里面如果Openmp没有被注释掉的话,那么temp那个变量应该是定义在循环里面,否则线程之间会存在争夺写入那个temp的风险。! |. P& I* Y: F  H9 a9 r
    内层for循环如果没有内部操作的话,编译时应该被优化掉了,和你完全注册掉整个循环是一回事。可能你的编译设置没有打开优化?9 G) L  y0 c# C/ e* O
    VS社区版没有问题,我工作用的就是社区版,设置正常的话不会比商业版差。以前游说头头用Intel Compiler,他说不想花钱,而且差不了多少,就一直用到现在。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2026-3-2 15:42 , Processed in 0.065221 second(s), 19 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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