设为首页收藏本站

爱吱声

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2022-9-24 22:54:26 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
    C++ 比 Octave 慢好多,怎么破?( f  h8 Y+ K: z
    ! }$ F5 m/ |+ v- n! j
    自相关两层循环,内层循环涉及浮点数计算,试验了一下把内层循环内部全都 comment out 只留个壳子,  但空的内层循环本身就把速度拉下来了,看来问题并不在浮点计算。
    : l* ], b% a9 q% L* l! |: k! y1 {& |) {/ d: G5 K$ V- Q( p- _' s" X. S% ]
    速度优化问题真的很有意思啊。1 @! T5 `: p# {- j8 T' B/ j- a  y
    + }+ k( x4 z/ B7 H# G
    欢迎大家继续讨论

    评分

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

    查看全部评分

  • TA的每日心情
    开心
    2024-7-10 00:43
  • 签到天数: 1707 天

    [LV.Master]无

    沙发
    发表于 2022-9-24 23:04:16 | 只看该作者
    拉下来?拉多少?' B6 A4 [8 h  e0 x
    把代码贴上来看看?
    4 G( u! j4 W# [* s3 d& u, a- v
    % A% X; y! }# [3 p+ s/ V: y难道分支预测不准破坏流水线执行?不该啊。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    板凳
    发表于 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 编辑
    0 ?( M' u0 O! L7 c
    数值分析 发表于 2022-9-24 23:04
    , z, _8 G& j0 y% J5 J: x- ]拉下来?拉多少?+ s  q% l0 l2 b5 l0 y# E) X
    把代码贴上来看看?
    , H& e8 j8 N- w# a' v2 o8 a
    ' ]9 f; Q" J) @9 A6 S' S
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)& a: K, E6 a& f6 Z& Q3 t( E6 L
    {) L# E# u( Z) ~) C8 I5 O$ d
            comp temp, xtimesy;
    , V, ?/ T5 q* `$ K        xtimesy.re = 0;
    * G' N5 v  H/ v+ I: _  e  B2 C0 K8 N        xtimesy.im = 0;8 b6 ^" q; X4 m( M" X+ u2 G; ^" J
            int j0 = lenB - 1;% j& Z; L$ G/ U9 [# B+ p
            int    i, j, i1, reali;7 J' |  _( |: F" O: I0 I5 ]
            if (lenA % 2 == 1), d0 _. z8 z4 r5 b! ?
                    reali = lenA + 1;
    % i" u( F' Q+ J+ T8 K, y        else
    7 ~* s. j) C4 f; J                reali = lenA;
    3 ^- y. p9 x5 [3 e" `' H' _        reali /= 2;
    ( ?6 j6 F; d. [1 }0 G7 P: `
    2 V7 [( M$ K3 d# R1 ^; u        int nconv = reali + lenB;) p7 }! U1 N, l
            //#pragma omp parallel for9 X0 l. B4 M$ G' ~! d# q
            for (i = reali; i < nconv; i++)  F6 |6 @# A3 g* z6 V) v
            {
    2 @; ^3 X1 M6 h6 n                temp.re = 0;
    ; R. @# R% V( w                temp.im = 0;. }2 V1 y' S( y* c
                    i1 = i;
    ) E  G" q! U! R3 \0 @                for (j = j0; j >= 0; j--)) A2 l0 l/ b# H" c4 ^- y
                    {6 B+ p  _. u- d% K
                            /* floating date operation */
    * ~4 P$ O1 ?( ^( J! u# ^. R3 Q                }
    7 X+ L* N: T. b6 k& H3 r. m  X, H
            }; t+ w+ l& O0 ^3 D  w
    }
    % ?$ d- q4 p1 J4 C* Y: h7 a/ l/ Z/ ]. X  m2 T3 d
    xcorr函数代码如上,comp是复数struct, 做过长度为11、19两个矢量的测试,和octave结果完全一样
    % Q/ s( H; G4 x* k
    1 x+ ]7 ^: W6 B) y红色部分是内循环,现在其内部操作都comment out 了, j0大概是 6000。
    $ d5 K& ]: }* w2 u2 A! Y: i现在call xcorr 100次,耗时78s.% t5 o8 {" J9 l9 Y3 t

    4 B4 `; I3 }' g6 V3 k如果把红色部分内循环本身完全comment out, call xcorr 1000次,耗时 <1s.
    9 |& e3 J  p  g' ^9 G/ ~- u; b0 L2 [. L
    ( b0 L+ f# i) ?( H# k1 f
    回复 支持 反对

    使用道具 举报

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

    [LV.10]大乘

    6#
     楼主| 发表于 2022-9-25 00:17:17 | 只看该作者
    风雨无阻 发表于 2022-9-24 23:33
    7 }5 |, Y, z8 U- |/ t) s3 }Maybe Debug mode?
    4 S+ q; X( X- Z: z5 N3 ]
    ; }8 }2 k/ {8 h7 l  s' P: D
    不应该,看我上面的回复。
    2 _; c/ ?: ]& n# X
    , q( I: t+ g$ j! u$ M/ p+ V/ T' T8 u我更怀疑是 VS 社区版的问题
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2024-7-10 00:43
  • 签到天数: 1707 天

    [LV.Master]无

    7#
    发表于 2022-9-25 00:20:10 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 00:24 编辑
    5 ]4 z8 w1 u4 S1 ?! @0 ?0 m$ p
    雷达 发表于 2022-9-24 23:541 p- i: h+ D8 e  e4 o; e
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB); I; P5 T! w. }' b0 `5 y
    {$ I7 n* v0 w3 j2 k& Z: W
            comp temp, xtimesy;

    $ C3 G1 C- J/ O6 _4 W8 {7 G% E* n' S# o. I* G$ K
    这个不是这么比的吧。。。
    * L7 V6 f  m% T4 r4 H* u2 w4 p  r+ ?; _0 g
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    / Z% E' Z7 G# a+ @8 c$ Y5 K& M7 F1 B* C0 N; h
    而加上内循环,光jmp和dec指令就至少多执行了6000个,慢个几十倍不是正常的么?
    回复 支持 反对

    使用道具 举报

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

    [LV.10]大乘

    8#
     楼主| 发表于 2022-9-25 00:46:56 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 01:09 编辑
    $ r/ I& P- J1 |3 E+ a
    数值分析 发表于 2022-9-25 00:208 N* R' e7 s2 M7 {4 t$ H( w
    这个不是这么比的吧。。。
    " u. i# E  d7 J8 m5 ?6 j
    3 a) D1 E1 Z( J/ C+ A您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    : r1 T. a4 k$ F3 D
    - M* M% W5 _5 e6 |. \6 u! {0 P
    有道理。9 H  H8 d3 _( ^+ _* c
    所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,记得 numeric 库里有算向量内积的,我回头试试。4 Z8 P. j+ k' X; D1 v' \/ Z" p

    / g+ D# u& M& D, t, y8 v我先尝试尽量用标准库,一个小程序,不想搞得太复杂。多谢了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    9#
    发表于 2022-9-25 01:27:53 | 只看该作者
    雷达 发表于 2022-9-25 00:46
    , J  g6 X2 u6 V: h  E有道理。
    * b. R& g; l& n8 X) y0 ~所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,这大 ...
    0 ~( n. X: s, n& Y/ k" R
    你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子,把循环本身翻译成机器指令loop或dec/jnz,两者速度上会差很多5 Q6 v- }) t) x6 o
    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/ w% R) F% p2 J9 J7 x% _
    这个不是这么比的吧。。。
    ) _* R) k% G$ {: z# a( W# X( N0 U; j
    * f$ m. ~0 @; `" b$ ?您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    而加上内循环,光jmp和dec指令就至少多执行了6000个

    1 w. R; N# w# B: r! t+ D" J
    1 @& B2 x* ^5 w6 w  z. N. z3 r" K现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果循环这样跑,花不了多少时间。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2024-7-10 00:43
  • 签到天数: 1707 天

    [LV.Master]无

    11#
    发表于 2022-9-25 02:06:44 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 02:16 编辑 * {8 ^: e3 P! i3 Z1 T
    沉宝 发表于 2022-9-25 01:48& t2 S. G% [) i
    现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果 ...
    : L* X% y. ]; K$ \7 R% v) H

    , N+ @+ U5 G6 a是的,兄台说的对。
    ! _5 X, @( I7 y- C# r6 ~6 C, C2 @5 k  `1 k- E, X; O
    其实我想说的是 真正数值计算部分和代码中其他不直接计算的overhead的比值这个事儿。' f5 c* S7 K4 e; f* x7 n  r1 K

    * W+ h) w5 s  q) d雷达兄构造测试用例的时候,屏蔽掉了所有计算的部分,使得剩下的都是overhead,这样run time比较的结果就显得好像不合理了。如果把计算加回去,计算部分的run time会dominate,结果就不那么离谱了。因为不好说,所以用指令数对比的方式试图直观地说明这一点。, @! p- W9 M: n, C

    $ g1 A) a0 u% C, |  Z比如说,如果有计算,那么跑六千个循环相对于计算应该用不了多少时间。但是如果一边是什么都不做,另一边是六千个循环,那六千个循环比什么都不做慢几十倍了,就不是那么不合理了。
    ' X" y) O8 j6 J3 q' g& _! ?$ Y- z# h; f
    当然也有可能像兄台说的,是优化参数的问题,但我觉得更多地是测试用例设计的不合理。
    回复 支持 反对

    使用道具 举报

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

    [LV.10]大乘

    12#
     楼主| 发表于 2022-9-25 04:47:43 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 04:49 编辑
    4 ^; a  h" A$ A. \; R  k
    沉宝 发表于 2022-9-25 01:27
    ! m0 a2 L$ W+ l  Q4 ^你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子 ...

    ' f5 ^* W+ [$ {' `5 l2 z) ?% a9 k# j/ @
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差一倍,我上面这个差的太多了。: x8 {8 \- W; o! Z$ ]7 ^
    1 U8 g' c8 x4 f  c: ~$ a5 H" \
    我已经完全懵了。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    13#
    发表于 2022-9-25 05:51:23 | 只看该作者
    雷达 发表于 2022-9-25 04:47) \: M% o- W  X3 q) R
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...
    9 ^3 z5 K% w: K8 M
    时间差一倍的结果可以接受。
    2 w# Y  B, h  x- p; H( ?' B. \8 h  ^/ W, G" i' T3 @
    你还是用profile工具看看吧。现在大家都主观瞎猜。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2024-7-10 00:43
  • 签到天数: 1707 天

    [LV.Master]无

    14#
    发表于 2022-9-25 14:58:59 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 15:38 编辑 % ~* \- m! y& z/ U( a6 z
    雷达 发表于 2022-9-25 04:473 o' @7 v9 `% H  a% R# z& l
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...
    - u2 _) v! h  q& `! X* |& U

    & t8 [, A7 r. v  k, s5 Z9 t/ c( S9 Z+ n! A

    $ }% g; a' H- p8 Z- r能不能把这个也贴上来,看看和上一个有什么不同?
    回复 支持 反对

    使用道具 举报

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

    [LV.10]大乘

    15#
     楼主| 发表于 2022-9-26 01:30:03 | 只看该作者
    本帖最后由 雷达 于 2022-9-27 01:17 编辑
    . f6 n* K$ `4 {9 I3 R. ?+ c* G
    数值分析 发表于 2022-9-25 14:58
    * f! ?- L9 t9 i2 F3 o( E+ v能不能把这个也贴上来,看看和上一个有什么不同?

    ! Y8 W, @9 ^' E: E/ e8 J理了理思路,重新做了一个测试。4 L% I" e5 L& ?2 u! q2 x. m& g$ i- O7 A
    做了两个 vector 和 两个 float *, 都长 100000+ q, B2 }% R3 ]; m9 w
    外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.* Z' A% J) W! ^0 W

    4 i0 o% [' Q9 C- V( J; y2 w内循环试了4种方法,, Y3 e2 z% v# E# b5 t( i5 R  W
    1. 直接调用 vector inner_product 247s 0 g  i( {7 {. u# a4 Y
    2. vector 循环点乘累加 237s
    5 d: E8 t. {7 k# m; b3. float * 循环点乘累加 204s  y/ g1 P; a4 Y0 [- V0 D& K/ W8 e
    4. 空循环 100000 次 202s
    ; D# ]' y. l" S$ r7 W+ s
    / R- V/ _( y, H: V+ g+ M( O不做内循环 200s- ~* g, q  x5 j0 _2 Y- H
    # ], c4 D$ Z) F# R; F8 |
    你昨天说的对,内循环本身占比是很小的,大头在其他处理。" U6 ~1 v9 R5 N( b
    另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。( w$ @$ J( r, Q0 H

    / D$ }6 W4 F1 ?0 T; {) t4 J至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)! D6 X$ D/ N/ B0 B

    ' R! {! M. B2 n- a: D4 u(为什么下面我贴的  b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成  jj 好了,原来 方括号里的 i 是斜体标志  LOL)
    3 S4 o1 T/ P  W# d* E1 l" @- `/ E) p. N4 u1 t8 @
            std::vector < float > vec1(N);: a. j! L  Z  r+ O* H
            std::vector < float > vec2(N);
    ! a& T4 s1 L" G9 q9 z$ b" n        float* b1 = new float[N];6 s. y0 Z. D' r" b+ e9 |8 O
            float* b2 = new float[N];$ M% S& n, ~$ C4 B% J6 v

    9 d; `( Y$ D. C        for (int j = 0; j < 6000; j++)# \# g" g# ^" P$ V4 Q! q1 s
            {
    2 V2 w& M1 u( ]: T8 X& d                std::generate(vec1.begin(), vec1.end(), []() {
    $ L1 B" V4 R& P9 X" f+ K; Q4 `                        return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
    7 v& g$ ]# d6 D. X/ M+ n( K% O0 o* I) p                        });
    9 i$ P/ v+ v* n( t, ~' q+ T8 T+ Q% |# H& O; n& Q$ i
                    std::generate(vec2.begin(), vec2.end(), []() {4 G1 v( l; V8 q: A
                            return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;6 v- s* [* Z; b4 v
                            });- U, H& M$ T( r  d/ }% A/ |
    % B  j  v/ @8 u8 [
                    for (size_t jj = 0; jj < vec1.size(); jj++)
    # h, F/ V$ I6 H& u" b                {4 f  P0 ]" @9 j% ~$ T3 M" A. X
                            b1[jj] = vec1[jj];+ @3 l+ x. d% }7 e( }; x" r
                    }
    " l0 w7 x& E& O5 z& ?7 n0 s- c* k0 M
                    for (size_t jj = 0; jj < vec2.size(); jj++)) V9 i2 n( q8 @3 f* M/ Q
                    {
    $ b3 F, |9 H% t. a                        b2[jj] = vec2[jj];
    ) D7 q$ i" R% |: h1 j                }
    % j0 W" Z/ a, a* J- C2 I0 Q4 f9 G0 ^
                    //Method - 1  N=100000 247s  
    $ ?7 ?6 M  @+ m" M! z& z+ q                //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
    - D& P6 f  L  |- Y                                " _% O: U! ]1 n" }, F, i
                    //Method - 2  N=100000  237s. l! O# z& x6 [! E1 j/ l& F) x
                    /*: Q5 x) c! u5 c6 r
                    for (int jj = 0; jj < N ; jj++)
    4 `. _) ]/ m& F) `+ R                {$ Q3 M7 _. _7 O: q) ^) }; y
                            fresult += vec1[jj] * vec2[jj];
    ) B7 }: w3 n- v0 s$ O3 f9 w* I1 {                }
    # h0 l$ @1 r$ \. S0 [                */
    0 Z  T0 b1 j# g; x  z2 C+ X# ~& K                                
    / B" Q, b0 w* R2 P# r$ h. y                //Method - 3  N=100000 204s
    - L2 N. v, D* O" y                /*9 ?% U( o& G3 h" t# D$ I6 X* \4 F$ K
                    for (int jj = 0; jj < N; jj++)+ _! P: `3 ^; k9 ?/ t
                    {
    2 l6 \; I) ?/ q2 s( ^                        fresult += b1[jj] * b2[jj];7 K; K. S, d) E3 v0 t/ M
                    }6 p4 H/ n! }* u& t0 ^/ n2 @/ ]+ O
                    */! I' K  @% O* k& k" h2 W
    9 d$ k8 M! A  g, G( O  N* \& Z
                    //Method - 4   202s' v2 P$ B7 W( C- j8 }$ x
                    /*
    ; O8 I% M" I! G7 X  V8 s, T                for (int jj = 0; jj < N; jj++)
    ) y. `* F! U; E/ T$ u8 E                {0 U1 b  m' y' r5 `0 K) Q
                            % s. C/ s- f: s' q
                    }
    : `* B& Z- D$ {' m( M% E                */
    3 |' C- f. s1 q- v3 L2 \                //comment out all methods, N=100000  202s               
    1 F! X$ ^$ Y9 j; L" d7 C# l        }& Q" a  j( R& j* \" d9 u# n

    4 t8 T% `. `  A. D1 b4 U3 [% b+ }        delete []b1;3 `7 q0 o- H/ R! O4 e2 d
            delete []b2;

    & g: h8 Q+ A. q& z, Z4 p( t
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    16#
    发表于 2022-9-27 00:15:38 | 只看该作者
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?) o* m1 n/ Q# g  ?/ h9 o3 \
    % `0 g9 c: h+ T. e
    你第二个试验里面的j在循环里面又重新定义了啊,你确定真的跑了6000次?
    % h) h6 J& [! d/ w
    回复 支持 反对

    使用道具 举报

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

    [LV.10]大乘

    17#
     楼主| 发表于 2022-9-27 01:16:03 | 只看该作者
    机器猫 发表于 2022-9-27 00:155 }0 X3 }5 C- s/ o' \- b
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?; l2 [# P, V/ F# N% ^% ~1 N

    2 I6 o4 X# W- \8 Z; F# j6 _- A: }你第二个试验里面的j在循环里面又重新定义 ...

    . W3 A, C# u4 X8 @内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL
    ! |  g3 N+ n3 G( N9 i5 C- P
    0 T0 {& ]& D4 c5 ^( P" @/ D: q7 q不和它较劲了,瞎耽误工夫,我已经转到 ubuntu, 也准备顺便试试 avx2 向量化。
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    18#
    发表于 2022-9-27 02:06:58 | 只看该作者
    雷达 发表于 2022-9-27 01:16
    ) ^) i9 x$ J) h2 p6 E' C) G# W  f内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL  C1 H4 G/ L: E6 O/ S
    7 l" G) ^' r# e9 x; g
    不和它 ...
    ! \: h/ o7 k" V5 R" z$ w

    0 Q3 D2 `' `& R- M* F不过可以试试我说的register变量。前一个试验j是混在一堆其它变量里一起定义的,很有可能是在stack上,这样内存读写会更多,要是再碰上每次都需要加载cache就更慢了。
    9 P* f8 |; p) R) u% G后面一个是在循环那里定义的,说不定编译器就把它优化成register变量了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

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

    使用道具 举报

    该用户从未签到

    20#
    发表于 2022-9-27 20:29:50 | 只看该作者
    雷达 发表于 2022-9-24 23:54
    " `* O0 o" Q! i1 ~6 @* xvoid xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)  i1 n5 [. o$ U3 R7 ^. b& Y
    {1 x, ?, }0 P, I7 F* ~2 C
            comp temp, xtimesy;

    9 t* g! g& t$ p+ F1 N8 a# Z: \这个code里面如果Openmp没有被注释掉的话,那么temp那个变量应该是定义在循环里面,否则线程之间会存在争夺写入那个temp的风险。  b( E$ r# z5 V6 s1 t
    内层for循环如果没有内部操作的话,编译时应该被优化掉了,和你完全注册掉整个循环是一回事。可能你的编译设置没有打开优化?
    ) H, ~3 R/ W2 D- Q4 |+ }* u7 FVS社区版没有问题,我工作用的就是社区版,设置正常的话不会比商业版差。以前游说头头用Intel Compiler,他说不想花钱,而且差不了多少,就一直用到现在。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2024-10-26 08:32 , Processed in 0.041498 second(s), 19 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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