设为首页收藏本站

爱吱声

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

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

[复制链接]
  • TA的每日心情
    擦汗
    2024-9-2 21:30
  • 签到天数: 1181 天

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2022-9-24 22:54:26 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
    C++ 比 Octave 慢好多,怎么破?
    , ^5 c: T3 [: a: p/ b. D. e
    / b- m: g1 O7 c( n- C6 L" ~自相关两层循环,内层循环涉及浮点数计算,试验了一下把内层循环内部全都 comment out 只留个壳子,  但空的内层循环本身就把速度拉下来了,看来问题并不在浮点计算。
    % a; y) [( K9 ^( X# d1 t8 v  ^7 }! u6 `
    速度优化问题真的很有意思啊。
    + _5 G( W9 _; o6 ]/ n: i# m9 l3 [6 Q; J5 P
    欢迎大家继续讨论

    评分

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

    查看全部评分

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

    [LV.Master]无

    沙发
    发表于 2022-9-24 23:04:16 | 只看该作者
    拉下来?拉多少?
    4 R0 }) L7 _" U  d把代码贴上来看看?. l4 D3 e9 J  _' e* X) n( L
    & p1 Q( u0 R3 S6 b
    难道分支预测不准破坏流水线执行?不该啊。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    板凳
    发表于 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-9-2 21:30
  • 签到天数: 1181 天

    [LV.10]大乘

    5#
     楼主| 发表于 2022-9-24 23:54:10 | 只看该作者
    本帖最后由 雷达 于 2022-9-24 23:57 编辑
    - w5 Z. ~$ ^! f- T* A/ D/ ^- f
    数值分析 发表于 2022-9-24 23:04
    0 C# {" \# U' ^, \( o( G/ J% |7 {. i拉下来?拉多少?
    & i6 h7 L* l/ m, v把代码贴上来看看?

    # X# Q/ |# s4 b5 U0 \3 c9 }2 x( N+ O
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)# t4 H/ H: ]% L" s' [9 g
    {. E& t; f' P4 x  w* p: W; ]! b0 L
            comp temp, xtimesy;) T6 S* v  D- x. o" f- G
            xtimesy.re = 0;
    * N& o9 N' p& y7 R        xtimesy.im = 0;$ {0 \3 ]( Y; u5 M& U
            int j0 = lenB - 1;
    ' e) C; E( u3 Z4 Q        int    i, j, i1, reali;! |- e' E9 j8 [  V! Y: U5 S/ ]& |
            if (lenA % 2 == 1)
    % Y6 b8 W  Z7 K/ w! }! V                reali = lenA + 1;
    / W8 ?% Z/ A/ U9 Y) O& N* X        else* q; l: v0 C5 r
                    reali = lenA;
    , e6 n2 c0 h* z6 W3 p# e/ ]        reali /= 2;
      J4 p) {+ t# \6 H) z# [2 B$ {; q8 h7 ?# D5 z9 [* ?( l
            int nconv = reali + lenB;
    . ~7 n2 Y. a2 J8 B# h5 q- T# C        //#pragma omp parallel for$ A7 R+ Q( S- F5 T6 I6 C' c
            for (i = reali; i < nconv; i++)% }$ J* s0 N# O! {# _8 X
            {: L* q' c) _' F5 k: u3 I
                    temp.re = 0;( V$ g  Q* X, |
                    temp.im = 0;
    3 ]+ U- k. F$ T, l/ c0 n& _! j3 L5 t                i1 = i;
    4 l; w& y; Z+ n% P5 Y                for (j = j0; j >= 0; j--)$ l0 \  v: l; }5 C5 ~  @1 ?
                    {+ K+ z; u2 {' B
                            /* floating date operation */
    7 R) L7 j3 K0 J                }

    3 C" U; W: x. F9 S) {' v        }% ?) q& d# {1 N: w0 g- A
    }
    $ V/ x5 Q3 l! j, \9 x
    : Y$ v2 m/ b$ p: `. O; `! rxcorr函数代码如上,comp是复数struct, 做过长度为11、19两个矢量的测试,和octave结果完全一样8 T! Q  A7 k, Z

    2 `( c/ E' |! J8 s. d& F1 R% h9 N红色部分是内循环,现在其内部操作都comment out 了, j0大概是 6000。
      Z3 }% Q' ?0 N0 F# H' Y) m现在call xcorr 100次,耗时78s.! M" o3 e9 ?( K/ ^4 d

    " K$ @) b2 k& ]. X- H! M/ k如果把红色部分内循环本身完全comment out, call xcorr 1000次,耗时 <1s. . l, @5 [7 I+ O: ]( P

    ! k9 I/ L( r' k
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    擦汗
    2024-9-2 21:30
  • 签到天数: 1181 天

    [LV.10]大乘

    6#
     楼主| 发表于 2022-9-25 00:17:17 | 只看该作者
    风雨无阻 发表于 2022-9-24 23:33/ @+ M8 y/ o$ z$ g: m2 B
    Maybe Debug mode?

    0 R- C" y9 z: O1 w' g; f, O7 |0 F
    不应该,看我上面的回复。1 @+ b, I6 W& W1 X$ W, b

    ( [3 }6 y% M8 l, o1 V6 d我更怀疑是 VS 社区版的问题
    回复 支持 反对

    使用道具 举报

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

    [LV.Master]无

    7#
    发表于 2022-9-25 00:20:10 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 00:24 编辑   G* [$ O  e. E; I) K" H, ~
    雷达 发表于 2022-9-24 23:54' J8 j+ A2 h: a
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    9 x5 G) b9 l; H# A{
    # w1 p$ m/ n/ z: a1 D! E6 ]" c- \2 j        comp temp, xtimesy;
    8 u$ |$ Y1 L& `/ l+ E9 G) \

    4 z; @5 O9 w4 Z+ Q& y: ~这个不是这么比的吧。。。! e* p" L: Z. ?6 v. F4 r& e

    ! n* M/ {3 J( q0 d" d% w您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    5 M1 {8 o  Q4 C9 v5 Q1 q9 O  i" m7 J! h+ f
    而加上内循环,光jmp和dec指令就至少多执行了6000个,慢个几十倍不是正常的么?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    擦汗
    2024-9-2 21:30
  • 签到天数: 1181 天

    [LV.10]大乘

    8#
     楼主| 发表于 2022-9-25 00:46:56 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 01:09 编辑
    ) N0 k0 Z( I7 Q% X2 K
    数值分析 发表于 2022-9-25 00:20
    ; P$ T$ T) a( c4 P5 I( Q- W这个不是这么比的吧。。。* m1 H' I! ^& a+ e

    . i7 e4 d; Y: D& ~- d您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    " Y6 m+ P  Y: J

    , t7 H- S' {! ]0 X0 D0 _有道理。
    1 r5 F* P* |  |, ], \$ G$ n所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,记得 numeric 库里有算向量内积的,我回头试试。
    9 j& l# q! K1 I6 G* s7 A: ~( m2 C3 d) _7 u2 p; A! T
    我先尝试尽量用标准库,一个小程序,不想搞得太复杂。多谢了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    9#
    发表于 2022-9-25 01:27:53 | 只看该作者
    雷达 发表于 2022-9-25 00:46
    ( d, K! f( M) A) P' G有道理。! v# S+ a& j/ [! W5 T( F% W
    所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,这大 ...
    0 b5 X+ t# B% R- J' u7 q7 Y6 B
    你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子,把循环本身翻译成机器指令loop或dec/jnz,两者速度上会差很多
    . L" U2 ]5 C0 e5 g6 H) mWhy is the loop instruction slow? Couldn't Intel have implemented it efficiently?
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    10#
    发表于 2022-9-25 01:48:51 | 只看该作者
    数值分析 发表于 2022-9-25 00:209 d. J5 H( z2 o: R5 J1 A3 H
    这个不是这么比的吧。。。
    6 Q' c7 Y5 T, s3 c
    & Q' W1 c' G% t2 L) V9 b您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    而加上内循环,光jmp和dec指令就至少多执行了6000个

    . x2 l6 v9 l8 ]
    - T: i4 `0 m2 e. r现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果循环这样跑,花不了多少时间。
    回复 支持 反对

    使用道具 举报

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

    [LV.Master]无

    11#
    发表于 2022-9-25 02:06:44 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 02:16 编辑 / z  ?' k7 G7 _/ r
    沉宝 发表于 2022-9-25 01:488 i6 A7 t1 U( K7 [, t, f
    现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果 ...
    ' V, S7 Q# u& e3 V

    : _+ r% w! @: D) w6 I/ a' P是的,兄台说的对。+ t3 [$ @) g& L

    1 v/ }- x* C& h其实我想说的是 真正数值计算部分和代码中其他不直接计算的overhead的比值这个事儿。
    9 W  r9 r/ M" C# e$ A: o' q: H# \: p1 l' X# w8 ~% t+ O4 k
    雷达兄构造测试用例的时候,屏蔽掉了所有计算的部分,使得剩下的都是overhead,这样run time比较的结果就显得好像不合理了。如果把计算加回去,计算部分的run time会dominate,结果就不那么离谱了。因为不好说,所以用指令数对比的方式试图直观地说明这一点。& x/ a0 Z" s4 y% b. n  U+ |' z
    ! l+ F1 }; x6 O& S% \' `  \: \% D
    比如说,如果有计算,那么跑六千个循环相对于计算应该用不了多少时间。但是如果一边是什么都不做,另一边是六千个循环,那六千个循环比什么都不做慢几十倍了,就不是那么不合理了。; N/ W+ M/ ?5 \5 V4 q8 H
    6 x- _- h2 j( D8 @1 k
    当然也有可能像兄台说的,是优化参数的问题,但我觉得更多地是测试用例设计的不合理。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    擦汗
    2024-9-2 21:30
  • 签到天数: 1181 天

    [LV.10]大乘

    12#
     楼主| 发表于 2022-9-25 04:47:43 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 04:49 编辑 ! }$ M: B4 U# Z, z
    沉宝 发表于 2022-9-25 01:27  b; ^: q7 L; }4 K9 y
    你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子 ...

    / K9 d! f; b' z6 Z9 L+ h$ I' R! I& F+ [9 X8 K
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差一倍,我上面这个差的太多了。
    7 j1 G# J# h/ j% ^7 A6 p& C, c4 I. ], l$ A+ s3 J1 I
    我已经完全懵了。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    13#
    发表于 2022-9-25 05:51:23 | 只看该作者
    雷达 发表于 2022-9-25 04:47
      N0 y; F) Q* a: ^5 i$ m又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...

    # ?' C+ h* M' R$ w# J7 {2 O时间差一倍的结果可以接受。
    0 [& g! E4 X) L: `# {% @9 N. T- b
    $ c( t- }. z1 H4 f9 n; e你还是用profile工具看看吧。现在大家都主观瞎猜。
    回复 支持 反对

    使用道具 举报

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

    [LV.Master]无

    14#
    发表于 2022-9-25 14:58:59 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 15:38 编辑
    6 H4 V6 p0 z' ~( F
    雷达 发表于 2022-9-25 04:47
    2 h8 B5 Z- d4 q% G+ J5 F又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...

    ' Q! \8 }1 K5 o% j4 x% @6 @
    0 {3 R) X$ E9 Y: h; Z5 y8 B* u% H* Z( R8 h# a7 V. {
    5 M% m& H4 ]4 I9 i; V0 U
    能不能把这个也贴上来,看看和上一个有什么不同?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    擦汗
    2024-9-2 21:30
  • 签到天数: 1181 天

    [LV.10]大乘

    15#
     楼主| 发表于 2022-9-26 01:30:03 | 只看该作者
    本帖最后由 雷达 于 2022-9-27 01:17 编辑
    ' k5 o: f, d' \" y
    数值分析 发表于 2022-9-25 14:58
    2 u4 B% @0 R- ?: U/ ~3 I0 I能不能把这个也贴上来,看看和上一个有什么不同?

    ( q( {  v" S1 m: ~7 S理了理思路,重新做了一个测试。' h! i0 X* i/ l" i  v
    做了两个 vector 和 两个 float *, 都长 100000
    - v/ n1 w$ ]1 s外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.0 _( o' Q1 O$ m, R; Q& e
    $ H3 }* f2 u8 `- w# u) i
    内循环试了4种方法,9 P; B; F! \& X; [$ g& G0 z7 s* `2 O
    1. 直接调用 vector inner_product 247s ) F; S: S8 a; A# Z1 k
    2. vector 循环点乘累加 237s& ?) [6 @3 x7 y% `/ ~
    3. float * 循环点乘累加 204s0 Q2 W" j5 B* i
    4. 空循环 100000 次 202s
    + D7 }* b" i/ j4 I: {6 n3 u* l% _& E
    不做内循环 200s
    9 A  R  i# p5 [" m! {# k  f% A0 z2 S, S  L2 c
    你昨天说的对,内循环本身占比是很小的,大头在其他处理。
    9 `' _5 e9 p$ C; M- h5 N8 ?$ [1 v另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。1 w) l/ `1 L( I6 k

    % a) G* F; k% i; k2 [至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)) J  ~. f% t5 Q$ ~

    6 j8 z" z0 ~8 z  E6 V5 {( E(为什么下面我贴的  b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成  jj 好了,原来 方括号里的 i 是斜体标志  LOL)& F7 {- J: f; P9 x( Q
    4 @$ H* C& Z7 t) r, }7 H
            std::vector < float > vec1(N);) D+ t* Q( A9 w9 j0 U$ v" G+ P
            std::vector < float > vec2(N);  c1 B* p2 h) a" q/ s; g" `* u
            float* b1 = new float[N];
    $ X! H+ |7 n( \) e        float* b2 = new float[N];
    " e0 g) y( O2 S0 z% g
    ! n4 [1 t8 ]& `  q* i& u4 h! {        for (int j = 0; j < 6000; j++)5 Z- a1 p) x7 ^/ V
            {
    8 c& z2 y, k& z" X3 W) I) A                std::generate(vec1.begin(), vec1.end(), []() {
    & ]* w7 t. U/ C8 z5 x' O  r( D% }                        return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
    4 Z6 A( \. a/ i+ o: f3 @; w8 @                        });
    & l$ N2 a1 z  r8 \! c( I0 R! x
    1 `, \$ g  ~& N$ w4 h" P% T                std::generate(vec2.begin(), vec2.end(), []() {2 z! l3 c" l1 e" r+ V' }1 P0 p
                            return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;) T$ s2 [; R8 ?% J$ R
                            });
    * S3 R1 Z7 e/ D) k/ G/ w. [0 }+ N7 c' y3 Y. S- _0 u
                    for (size_t jj = 0; jj < vec1.size(); jj++)) I" \$ w( ^- f
                    {
    / S% z# R1 R5 z$ ]0 x/ Y' u                        b1[jj] = vec1[jj];  \* A1 J) R" s& _3 W! g0 u5 d
                    }9 |, q8 A8 r* j) m$ |
    ; K( K8 ]- [  C6 s* G
                    for (size_t jj = 0; jj < vec2.size(); jj++)6 H$ _7 v" A$ S1 {4 k, N. p
                    {
    1 T! A; u' l# O* u( b                        b2[jj] = vec2[jj];
    & a$ }. L8 h0 f5 i% f+ L1 g! _" K                }6 _  H  o: i5 z% i' _7 m: v
    , c1 P8 g( e: F  b
                    //Method - 1  N=100000 247s  , J1 A  T+ l; \- ?$ ~7 x9 J* N3 B
                    //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
    1 i- e  O7 J" h  c2 B; L                                
    * i! f- @, \+ F1 |) @3 J" j5 R                //Method - 2  N=100000  237s+ W: ^* g4 y2 t1 L: m$ \3 Q0 C5 _, @
                    /*. f. `0 ]3 n- g( ?4 k
                    for (int jj = 0; jj < N ; jj++)
    3 Z- X7 R* v3 h/ W+ e! ~                {
    4 A5 I$ B" r$ d' V                        fresult += vec1[jj] * vec2[jj];
    3 [5 D6 ^6 `+ @2 o7 I                }
    8 h8 h: t8 L9 ^' j5 V, ~                */, |* `1 T, ^' e# s+ H" [
                                    0 x5 K4 t- ]( \2 f
                    //Method - 3  N=100000 204s
    8 |4 @! ]' s* W: }% _( O  t5 ^) U* i                /*
    # e# u! e8 T' P) d, ~                for (int jj = 0; jj < N; jj++)8 ]1 e# y% Q: {9 H7 f, R! S
                    {! V- H4 n3 P5 m0 c
                            fresult += b1[jj] * b2[jj];* A$ L2 F4 ~$ |3 ?
                    }
    + f& N, y( U* M* |5 @! o                */8 t$ c( M9 I8 J* r0 a+ q
    1 l( I' l2 `+ y9 V
                    //Method - 4   202s4 S* {, u) Y7 W, y2 \! i
                    /*
    3 G6 n3 x. N) Y' ?! O7 j6 ~                for (int jj = 0; jj < N; jj++)
    6 Y; J. b2 S* B2 I  j- {, Z3 J                {" g  }- U' M; `$ H
                            
    : H' b: _+ l- P( _2 j                }
    ! H- z7 [  C' ]: o                */4 }2 |$ R, S9 L
                    //comment out all methods, N=100000  202s                ; c3 h9 k0 @( Z$ u$ Z
            }% l1 g$ @0 j# s8 ~2 e  U- h6 |

    # E# n9 b3 l& H  @7 {* M) E' h( m        delete []b1;
    1 i" V3 k2 u- i2 O. n        delete []b2;
    ; P, T7 \/ p3 u% l4 \0 @
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    16#
    发表于 2022-9-27 00:15:38 | 只看该作者
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?
    " B! H. J0 V) R5 ~5 w
    6 b, ~$ J6 W* R0 W  O" U3 D你第二个试验里面的j在循环里面又重新定义了啊,你确定真的跑了6000次?- R  V5 ^( h# Z" B- z, P( i$ n+ ?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    擦汗
    2024-9-2 21:30
  • 签到天数: 1181 天

    [LV.10]大乘

    17#
     楼主| 发表于 2022-9-27 01:16:03 | 只看该作者
    机器猫 发表于 2022-9-27 00:15
    5 z! B. ]: M) Z4 Z4 F瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?/ J' ~+ ^/ c2 Z8 ?- S: S$ g
    ' `# Q# r8 J; g" f; ?. d
    你第二个试验里面的j在循环里面又重新定义 ...
    : \9 K# h3 R" L
    内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL
    8 M, @7 p0 Z% K+ {. F7 g
    8 N( x4 u& T1 e' V3 N& u# E7 ^- a不和它较劲了,瞎耽误工夫,我已经转到 ubuntu, 也准备顺便试试 avx2 向量化。
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    18#
    发表于 2022-9-27 02:06:58 | 只看该作者
    雷达 发表于 2022-9-27 01:169 a3 j. U9 X3 A$ K; e! c
    内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL
    ( l% z! J; S$ }; B+ }* j/ L' d+ Y; |( s0 v0 h' Z4 k7 M
    不和它 ...

    7 P9 V9 o1 k- Z; C) i% N, ?) u+ i' _  w# \% c; c
    不过可以试试我说的register变量。前一个试验j是混在一堆其它变量里一起定义的,很有可能是在stack上,这样内存读写会更多,要是再碰上每次都需要加载cache就更慢了。
    % ~7 e. L5 p9 j( v( E! t后面一个是在循环那里定义的,说不定编译器就把它优化成register变量了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

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

    使用道具 举报

    该用户从未签到

    20#
    发表于 2022-9-27 20:29:50 | 只看该作者
    雷达 发表于 2022-9-24 23:54+ ?5 h( ~6 n# c, D1 U
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    5 O: w6 w3 V) J+ N  O$ F  ]6 P{/ d& c, {$ ~4 s' J  z
            comp temp, xtimesy;

    9 m3 f. R8 ?: G0 R这个code里面如果Openmp没有被注释掉的话,那么temp那个变量应该是定义在循环里面,否则线程之间会存在争夺写入那个temp的风险。7 g) q1 ?- ^! `6 C7 Q
    内层for循环如果没有内部操作的话,编译时应该被优化掉了,和你完全注册掉整个循环是一回事。可能你的编译设置没有打开优化?2 ~( U- t9 L+ U, B
    VS社区版没有问题,我工作用的就是社区版,设置正常的话不会比商业版差。以前游说头头用Intel Compiler,他说不想花钱,而且差不了多少,就一直用到现在。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2024-11-22 19:16 , Processed in 0.043693 second(s), 19 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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