设为首页收藏本站

爱吱声

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

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2022-9-24 22:54:26 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
    C++ 比 Octave 慢好多,怎么破?. u9 i' r3 Z- t5 Q3 w7 N

    / C8 u! s  w! h自相关两层循环,内层循环涉及浮点数计算,试验了一下把内层循环内部全都 comment out 只留个壳子,  但空的内层循环本身就把速度拉下来了,看来问题并不在浮点计算。( ]0 y9 \' }3 }
    7 I5 x3 Z) H7 Q1 N8 |: D: r* ?  U) t, i
    速度优化问题真的很有意思啊。
    ; c4 @3 K% Z0 i/ p: @# c; N2 ]  l3 r. c) b. {9 ]
    欢迎大家继续讨论

    评分

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

    查看全部评分

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

    [LV.Master]无

    沙发
    发表于 2022-9-24 23:04:16 | 只看该作者
    拉下来?拉多少?
    , p/ X( I4 G; @1 S7 p: G把代码贴上来看看?% o- f3 p# d( E) J  j. o
    5 k* }  D: X6 g$ O4 j  M
    难道分支预测不准破坏流水线执行?不该啊。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

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

    使用道具 举报

  • TA的每日心情
    开心
    2026-2-24 07:04
  • 签到天数: 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 编辑 . l/ \+ R' f! R" n' |+ |2 A
    数值分析 发表于 2022-9-24 23:04
    # [( o6 p+ |' F. Q# j$ J4 {' s" t拉下来?拉多少?
    - o1 `0 ]# b6 n3 M) N把代码贴上来看看?
    ! x. L; m+ n% a  _8 d6 R9 ?

    3 q/ z$ ~! P( \0 M2 D) P. _void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    ! p% d; w6 t- a' Q$ K& {8 O{
    ( g9 Z$ @2 P( v: t6 ?! ?        comp temp, xtimesy;
    9 l' Y, `' w0 e4 U& ]' b4 x7 ?7 a2 c        xtimesy.re = 0;
    2 W/ X2 I# I: f! b8 J1 h        xtimesy.im = 0;4 D( F1 k( z. `3 O
            int j0 = lenB - 1;8 `+ a; ^: v( }
            int    i, j, i1, reali;' `2 U! D& S! {" S
            if (lenA % 2 == 1)( F$ Q5 C% X* `! m
                    reali = lenA + 1;
    ' j  y1 X( u( O: R, ]" s) k5 F3 \1 R        else5 |6 S' x( n9 l% R) l; l
                    reali = lenA;3 X8 h8 t5 W. l: ~2 Y& S
            reali /= 2;+ Y6 e! C6 k0 f. T& a$ M' Z

    % G" d4 N. ~) |" S0 V- r        int nconv = reali + lenB;
    9 ^* u, z& \5 e' _2 P" C2 F- z        //#pragma omp parallel for  `. d8 m  B  \
            for (i = reali; i < nconv; i++)
    ' x2 W  ?, L4 w8 D9 p        {
    ) `- U4 O5 ]' r% u" T. B                temp.re = 0;
    " Z: L; U0 T0 G) c* _0 ?                temp.im = 0;1 E' n) j' s8 h' X
                    i1 = i;7 F3 \; ^  u1 [/ V6 o% _: Y5 e) z
                    for (j = j0; j >= 0; j--); F3 d& `5 ~' N
                    {
    7 |  R- M. T& U4 g* Q( B0 q                        /* floating date operation */
    - w) o! c3 I' @+ @1 |) }                }

    % w6 _1 D! A  R) u1 _8 w        }( B3 J3 }1 c1 o& `  W* i
    }
    / N, J( |- X) M* r& C
    ; J4 ^6 B& D8 ?- ]$ z' Zxcorr函数代码如上,comp是复数struct, 做过长度为11、19两个矢量的测试,和octave结果完全一样" [" G" N6 w; V8 ^2 N
    0 t2 g/ D! [/ R
    红色部分是内循环,现在其内部操作都comment out 了, j0大概是 6000。  q, i( D' X/ @2 u+ B& }; R7 w
    现在call xcorr 100次,耗时78s.
    ) [- Q; z- B" R9 W. {( A& h& w9 ~0 d4 @
    如果把红色部分内循环本身完全comment out, call xcorr 1000次,耗时 <1s. - V6 Y1 ]& D7 K$ f8 w$ g$ Y2 k
    * q0 m# Q( r2 V! n5 y: m( H. {& J( _
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    6#
     楼主| 发表于 2022-9-25 00:17:17 | 只看该作者
    风雨无阻 发表于 2022-9-24 23:33
    : m  Y; r6 _  |: p2 tMaybe Debug mode?
    & s4 Q' Z4 I1 `
    ; O- l1 q) x9 K
    不应该,看我上面的回复。
    ' v4 ]* h. }  {- I1 U0 U+ g& p$ o. v4 A; @4 K4 c
    我更怀疑是 VS 社区版的问题
    回复 支持 反对

    使用道具 举报

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

    [LV.Master]无

    7#
    发表于 2022-9-25 00:20:10 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 00:24 编辑 ) a3 {2 d3 W: i: u' ^
    雷达 发表于 2022-9-24 23:54/ O1 K( B& u( z7 q* F
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)9 G* n" \6 Y6 W1 T
    {
    ; A8 [$ x$ A* \. E6 G. k* K        comp temp, xtimesy;
    $ e8 c( b6 R  ~- Q: [0 d9 t
    # \  p# H7 A. `8 l  k9 U) o9 G
    这个不是这么比的吧。。。' s2 j! P$ u# u$ Y+ r5 O7 Y* V

    $ ~- G3 \0 B2 P8 Z您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。& b: \8 k& C# l4 G$ G# d6 K( a9 j% X
    2 B4 K/ r0 N$ z' h& O
    而加上内循环,光jmp和dec指令就至少多执行了6000个,慢个几十倍不是正常的么?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    8#
     楼主| 发表于 2022-9-25 00:46:56 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 01:09 编辑
    ' N8 c( I. e7 M: B3 T; T
    数值分析 发表于 2022-9-25 00:20
    / h5 w; E; E9 Y$ H5 \8 w这个不是这么比的吧。。。
    & y1 v2 _/ A6 H. o# n3 T& w7 I$ r& T' R0 v
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    3 f/ m3 D( I7 q3 t3 W" ~+ K. J  j

    - x  }' R) K& ]. T0 X$ a有道理。
    4 r- R* U: H& `7 _/ ~, V5 B所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,记得 numeric 库里有算向量内积的,我回头试试。
    ! W; ]0 x! G9 [2 V7 S# e) T
    & ?: A1 x0 b3 E7 J我先尝试尽量用标准库,一个小程序,不想搞得太复杂。多谢了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    9#
    发表于 2022-9-25 01:27:53 | 只看该作者
    雷达 发表于 2022-9-25 00:46+ G) u* a" ]* M% K$ w
    有道理。
    ! T! N! c9 Z% `3 K所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,这大 ...
    % P# N1 e. G0 `' w
    你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子,把循环本身翻译成机器指令loop或dec/jnz,两者速度上会差很多
    ) e# i  J3 _% Z* }0 n1 m/ CWhy is the loop instruction slow? Couldn't Intel have implemented it efficiently?
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    10#
    发表于 2022-9-25 01:48:51 | 只看该作者
    数值分析 发表于 2022-9-25 00:20
    6 s+ m  i! w& A6 l' h这个不是这么比的吧。。。
    # v& D" W: |* F  [" n' K5 W7 g6 x, h' H+ e) y' S3 K" ?- U
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    而加上内循环,光jmp和dec指令就至少多执行了6000个
    : Z! U& C* l' h

    : P. ^% i( g1 |+ H现在的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 编辑 # j6 Z% J( k- i7 f
    沉宝 发表于 2022-9-25 01:48
    , x1 M, B% J8 x3 v2 C3 d' i3 N% m现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果 ...
    $ ~# h1 }* d7 N- v

    7 m% h  \+ x* M# u是的,兄台说的对。
    ) D9 m2 Z- s. G0 n- r, F: n: U7 H) g& @% }
    其实我想说的是 真正数值计算部分和代码中其他不直接计算的overhead的比值这个事儿。
    / Q. u8 \( w9 }: ~  Y. P
    ' U3 b  x1 D6 v. u雷达兄构造测试用例的时候,屏蔽掉了所有计算的部分,使得剩下的都是overhead,这样run time比较的结果就显得好像不合理了。如果把计算加回去,计算部分的run time会dominate,结果就不那么离谱了。因为不好说,所以用指令数对比的方式试图直观地说明这一点。
    ! \- {3 f/ Y2 p2 x
    6 Y4 n$ U& t6 m) b- P- }' m( M比如说,如果有计算,那么跑六千个循环相对于计算应该用不了多少时间。但是如果一边是什么都不做,另一边是六千个循环,那六千个循环比什么都不做慢几十倍了,就不是那么不合理了。
    ) `3 p; G/ \' E1 I/ \$ ]9 P, G, J0 C" m9 Y6 D; V1 O- w, W# @
    当然也有可能像兄台说的,是优化参数的问题,但我觉得更多地是测试用例设计的不合理。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    12#
     楼主| 发表于 2022-9-25 04:47:43 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 04:49 编辑 ! L  l4 U0 ]3 y. v8 p$ q
    沉宝 发表于 2022-9-25 01:27
    + N, m. X! L9 O* r你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子 ...
    " c3 h$ A& Y  C" p/ b+ R- l
    ! p% }1 s7 _, [  F
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差一倍,我上面这个差的太多了。6 V$ B' a% Y$ ?/ z, r
    * @" }5 H. R  M0 i. n* v+ |
    我已经完全懵了。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    13#
    发表于 2022-9-25 05:51:23 | 只看该作者
    雷达 发表于 2022-9-25 04:47
    3 U, G- j3 @2 b% B6 S* h( k又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...
    8 d/ F0 _0 M+ L) U1 y2 H& g! u
    时间差一倍的结果可以接受。3 Q7 C+ q- r5 j: J! [

    6 _% z  T1 e  L+ u6 m/ D% z你还是用profile工具看看吧。现在大家都主观瞎猜。
    回复 支持 反对

    使用道具 举报

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

    [LV.Master]无

    14#
    发表于 2022-9-25 14:58:59 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 15:38 编辑
    7 U1 a3 U! a" @/ G8 A# B
    雷达 发表于 2022-9-25 04:47# @( Y3 T+ Q7 T% T* R
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...
    7 `  |; `/ q2 X+ @6 X( d, z

    ; D0 ^" ]7 R; n7 U7 [6 V5 O; X( r1 W2 j5 L- k$ `% u+ S9 W
    5 [, W' C, B) D: J1 F, l
    能不能把这个也贴上来,看看和上一个有什么不同?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    15#
     楼主| 发表于 2022-9-26 01:30:03 | 只看该作者
    本帖最后由 雷达 于 2022-9-27 01:17 编辑
    ( ~* s, m$ w9 _2 {5 H
    数值分析 发表于 2022-9-25 14:58
    # x+ ^( p  S, C/ p! E9 L1 D能不能把这个也贴上来,看看和上一个有什么不同?
    & M+ g# e1 n  U
    理了理思路,重新做了一个测试。4 `9 `+ l8 a, J9 _" f8 g8 t2 Q! A
    做了两个 vector 和 两个 float *, 都长 100000  E: n8 \6 M, a7 k
    外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
    3 c8 L& O- u1 y- R1 `4 R/ j
    0 A* }/ x6 D. M% l+ d5 ?+ A内循环试了4种方法,
    / z& ^% S* ~1 Z7 A1. 直接调用 vector inner_product 247s
    + c5 Q8 y/ a1 C) X2. vector 循环点乘累加 237s' f2 V1 @! p) A0 `& c
    3. float * 循环点乘累加 204s
    2 y  A$ P. z, M' J4. 空循环 100000 次 202s
    # c" U6 c- Q) [
      w% v2 b  T! v. Y不做内循环 200s/ B( `& h$ h0 h
    2 G6 T5 m0 w1 c2 R, v) x$ [/ I1 a
    你昨天说的对,内循环本身占比是很小的,大头在其他处理。4 R+ F# `- u& R' q4 c% r9 d) d* ~
    另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。$ O3 n  b) g% P4 X; a' A0 x

    ' i2 K1 h- z5 D( ^* f  A  e# d7 M至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)6 z( v1 E6 Z0 y/ ]1 R

    6 v9 ^- E2 I! b3 f(为什么下面我贴的  b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成  jj 好了,原来 方括号里的 i 是斜体标志  LOL)8 e2 C/ p/ Q& N9 D: @9 E$ j! W

    6 r. O- d- G- j* ~
            std::vector < float > vec1(N);
    0 X4 ?1 {% z+ |% f" s9 }3 Z) D        std::vector < float > vec2(N);! p; N+ i2 e# X: s) B  `+ N9 b$ d
            float* b1 = new float[N];, n9 Q% f2 ~/ D  `* N* U+ A
            float* b2 = new float[N];
    ; A1 T& j- A1 E: }/ i# q/ B4 ]' g! p' h  g. L
            for (int j = 0; j < 6000; j++)
    % }$ J/ E  X4 S9 u7 o6 {1 P        {, w. w) Z" m. O) O2 q7 h( Z1 l
                    std::generate(vec1.begin(), vec1.end(), []() {: l: P2 g; m. l7 N
                            return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;) u( I4 q1 M3 H- m( G0 z! a
                            });: p# w# y( e! Y) d9 W
    , \' n: ]( i0 H: u2 S( D
                    std::generate(vec2.begin(), vec2.end(), []() {
    # z: n5 R$ P3 `$ g$ x5 Y, }                        return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
    . l+ g( X7 S: F9 g) f3 b& L                        });: s6 N7 y- b  w6 J( K. g2 c

    & V/ O6 |1 P# x# j7 V                for (size_t jj = 0; jj < vec1.size(); jj++)6 K- H$ \( ?+ C- f3 Z7 P8 L9 R6 s
                    {
    / e% l/ i1 e2 C' P                        b1[jj] = vec1[jj];$ d' d2 G# p' @+ E. G( ^& X
                    }
    , o6 X9 O! |+ K2 E* q
    5 t# z: n: v$ |                for (size_t jj = 0; jj < vec2.size(); jj++)
    % l& t$ s2 O2 N9 i- b" ]3 P                {% A* k2 R  l( Q  C; ^" l
                            b2[jj] = vec2[jj];
    # Q* G0 W  f/ x% s                }
    ' @: Q- h! a- U+ W  F5 \' j  b( a6 c7 O/ P6 H
                    //Method - 1  N=100000 247s  
    % H) w8 t* [: t# g! l                //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);. L9 v. j7 H1 {
                                    
    $ p  C' p3 d$ T2 c                //Method - 2  N=100000  237s# }3 u( G4 k( e6 _: V/ R
                    /*
    % e  h8 T, h  A1 {7 t# Z                for (int jj = 0; jj < N ; jj++)
    # R2 Y+ f9 ?& t+ [7 m% {! n                {6 p) q6 r9 z, @7 T. G) @
                            fresult += vec1[jj] * vec2[jj];
    - e4 j8 l" y; [$ L1 c& P                }7 \' n- [/ r" Z. Q
                    */8 Q* N, ]5 h  E# Y
                                    
    4 C% K) T8 Q& y                //Method - 3  N=100000 204s/ k. }7 B! K1 q7 [( t  c
                    /*2 j  w: S. v2 {
                    for (int jj = 0; jj < N; jj++)
    ) `7 g; ~6 g% O4 v9 ~/ \' Y                {
    ! ~' k  V& N0 Z3 `( ?8 w                        fresult += b1[jj] * b2[jj];7 a" t  Y% ~$ ^" l" v) S
                    }% D) b5 e1 Q0 M0 T0 x0 Q
                    */
    3 C& R& K1 Y; D( C( W) B3 Z$ e$ v( N9 H9 |
                    //Method - 4   202s! ?, ~9 c3 E! p8 G
                    /*! w9 h* p1 `( Z# K: D
                    for (int jj = 0; jj < N; jj++)9 b/ o" \3 l1 |2 Q2 {. }
                    {
    . a5 Z6 k# ^5 L                        
    1 {( N' B* W) ~* v+ @! e                }
    8 {7 d3 u, A8 h8 H0 K5 R2 z                */8 }! }* P! }6 w" k5 W: o6 x
                    //comment out all methods, N=100000  202s               
    6 e! Y& K6 F$ P) H! c5 P        }: D2 k5 F) o% x" p, D+ t

    / d+ o& _% u  q0 j2 x( s2 d7 \        delete []b1;
    9 A, w7 a5 c. v5 A0 u        delete []b2;
    / g  l) W( C) W, o
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    16#
    发表于 2022-9-27 00:15:38 | 只看该作者
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?
    1 l& T* |0 t1 M( E& f& v! F  j) I, }' o" y& [& d# y5 Z, L- y
    你第二个试验里面的j在循环里面又重新定义了啊,你确定真的跑了6000次?
    ! n$ W! ^  A0 }' R1 I# Y" y5 m
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    17#
     楼主| 发表于 2022-9-27 01:16:03 | 只看该作者
    机器猫 发表于 2022-9-27 00:15- N! S$ v" T! ~  h8 i
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?
    " ]) D+ q( R1 `& T; Z7 ^% q4 q9 t* _. D6 b; f- l
    你第二个试验里面的j在循环里面又重新定义 ...
    ( [- F9 U; K6 O. M6 V0 b
    内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL
    8 W  Y& T; z3 E& L; E3 G$ c- D6 w+ ?2 i4 g3 {$ r: h+ Y' Y, x
    不和它较劲了,瞎耽误工夫,我已经转到 ubuntu, 也准备顺便试试 avx2 向量化。
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    18#
    发表于 2022-9-27 02:06:58 | 只看该作者
    雷达 发表于 2022-9-27 01:16
    2 z' o3 t& K( F4 ^- j内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL
    2 Q1 |2 {! ~+ [" H6 `0 J3 l3 i. [, F
    不和它 ...

    + v3 V) w  _, Z7 V' b9 R- ]* I- s4 b$ b
    5 V. s2 n- F: N2 w- r3 P/ I不过可以试试我说的register变量。前一个试验j是混在一堆其它变量里一起定义的,很有可能是在stack上,这样内存读写会更多,要是再碰上每次都需要加载cache就更慢了。8 Y0 Z- J2 p& E$ e, |  L
    后面一个是在循环那里定义的,说不定编译器就把它优化成register变量了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

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

    使用道具 举报

    该用户从未签到

    20#
    发表于 2022-9-27 20:29:50 | 只看该作者
    雷达 发表于 2022-9-24 23:54! l3 o9 }. y4 ]% W8 {8 c; U' y
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)( X! F5 y- R) [! f# ~5 K1 d
    {
    4 P" N% f( I' y0 ~6 e        comp temp, xtimesy;

    ( F6 k* A) @9 r* k) S0 Q这个code里面如果Openmp没有被注释掉的话,那么temp那个变量应该是定义在循环里面,否则线程之间会存在争夺写入那个temp的风险。- L$ v( Z9 ?3 ?% F( L
    内层for循环如果没有内部操作的话,编译时应该被优化掉了,和你完全注册掉整个循环是一回事。可能你的编译设置没有打开优化?
    4 s. O- L/ j7 N# D, R' XVS社区版没有问题,我工作用的就是社区版,设置正常的话不会比商业版差。以前游说头头用Intel Compiler,他说不想花钱,而且差不了多少,就一直用到现在。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2026-7-22 12:42 , Processed in 0.071951 second(s), 19 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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