设为首页收藏本站

爱吱声

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

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2022-9-24 22:54:26 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
    C++ 比 Octave 慢好多,怎么破?
    : p# K* p, m" Q' N* B  H# s; K+ G0 H; e* o/ ]% L
    自相关两层循环,内层循环涉及浮点数计算,试验了一下把内层循环内部全都 comment out 只留个壳子,  但空的内层循环本身就把速度拉下来了,看来问题并不在浮点计算。) f0 b, H# j! t0 j
    1 t3 `9 N" W0 G  A) G! m
    速度优化问题真的很有意思啊。
    5 \5 F/ t8 x% u  f1 |) q0 L% }9 I
    欢迎大家继续讨论

    评分

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

    查看全部评分

  • TA的每日心情
    开心
    2025-12-26 03:23
  • 签到天数: 1954 天

    [LV.Master]无

    沙发
    发表于 2022-9-24 23:04:16 | 只看该作者
    拉下来?拉多少?
    1 ~7 ]: }- d" v8 G# g把代码贴上来看看?
    ( _/ k2 ?# x, V; H: A! ~# j/ {! y7 \1 ?3 v; M
    难道分支预测不准破坏流水线执行?不该啊。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

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

    使用道具 举报

  • TA的每日心情
    开心
    2025-6-14 10:13
  • 签到天数: 124 天

    [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 编辑
    ( F' w1 C* v; }% y4 b! e& b
    数值分析 发表于 2022-9-24 23:04
    1 O; Z& h5 o. t8 ~6 A" B" O6 f2 w拉下来?拉多少?2 p; [: D/ [1 c. s% H' Z7 q% T! p
    把代码贴上来看看?

    + L& w$ D8 u$ ?; P4 q5 ^2 f& W' Y, n
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    , g! h3 d6 q8 f# @+ P! {{+ w6 R5 S, {, ]9 n+ [3 [
            comp temp, xtimesy;
    : ]! R& x5 t" @* z( D        xtimesy.re = 0;! D. Q" b9 `( l/ ]  X( A! d
            xtimesy.im = 0;* h/ N# Z" C  J. p* l
            int j0 = lenB - 1;
    + \7 P# z/ V9 f" }6 M# d1 j        int    i, j, i1, reali;+ q6 a6 ^; w: `- d/ b
            if (lenA % 2 == 1)+ L# f+ m# i, v* ?
                    reali = lenA + 1;' p' C  B* r4 O& s4 p8 U3 Q
            else
    # v8 U% o* E, [6 h9 b' ]9 m                reali = lenA;
    ; y2 \) V( U4 y% k" m3 ~) m& c# }6 V0 X        reali /= 2;. ?- B$ A+ s- _/ w
    3 o( @1 q% _" `, C3 `7 g
            int nconv = reali + lenB;
    # u6 O& I5 \$ b8 J; r8 E7 j9 l  X- ~        //#pragma omp parallel for
    ! P3 {+ S" i" L  ~' e5 m2 `        for (i = reali; i < nconv; i++)
    , ^, O1 ]* P% G5 Z' G        {
    2 x) t( h2 ?$ @, ]( Q# l                temp.re = 0;
    ( k, [# K5 K, h5 y4 y+ u/ e! V6 Y                temp.im = 0;
    , E) M, N4 Y5 n1 N  J                i1 = i;! x& q2 `( A# c7 ^8 l5 c
                    for (j = j0; j >= 0; j--)- k/ u  l5 {) a4 q) p
                    {
    ! x: b' w' Q# U- |! S7 c) }" w% @" q& ]                        /* floating date operation */1 I9 i; ?8 x* C$ p* U0 i
                    }

    . ~+ Z0 R' p& [( W$ e- t8 f        }
    9 {) U: j/ k- f7 `4 s% [}  X- X- v- y8 z$ k" {, M! D

    * Z$ m( t+ d( m! mxcorr函数代码如上,comp是复数struct, 做过长度为11、19两个矢量的测试,和octave结果完全一样( P$ ^- r% w2 T
    6 _& a$ m. J3 @0 \3 ?
    红色部分是内循环,现在其内部操作都comment out 了, j0大概是 6000。
    ! g/ O; I7 \$ n! N2 C# f现在call xcorr 100次,耗时78s.8 z6 v; G  |9 S1 t

    1 p- r& t; T" w2 Q" f如果把红色部分内循环本身完全comment out, call xcorr 1000次,耗时 <1s.
    1 |7 ?, i' F% C3 I* O1 P6 b2 c- G
    ; C- B) f7 K9 l" j  N
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    6#
     楼主| 发表于 2022-9-25 00:17:17 | 只看该作者
    风雨无阻 发表于 2022-9-24 23:33
    # B: {2 A7 {( D1 T) rMaybe Debug mode?

    ( ^8 b. v. J4 E% T! K3 y. j! f
    3 L4 n: S5 m1 ~; q& G' i3 Q! G& }不应该,看我上面的回复。
    0 E/ g1 @# e  T& x' L; N
    2 E: i) f9 K, B5 e1 p) J  S  u我更怀疑是 VS 社区版的问题
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2025-12-26 03:23
  • 签到天数: 1954 天

    [LV.Master]无

    7#
    发表于 2022-9-25 00:20:10 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 00:24 编辑
    ) l0 I5 U+ h) ^
    雷达 发表于 2022-9-24 23:54& c) h6 @  O( c! O$ |6 |
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)4 L% k4 c, e# T9 J: Q( y
    {
    % A* ^# ?6 Z0 I. C7 W        comp temp, xtimesy;

    5 V" i( I: N) |& F1 `  g
    5 u8 u! p* y; ~1 G5 p1 F$ @  \这个不是这么比的吧。。。; j- P$ j5 B0 q+ [
    ) z/ K; ~9 J  A* e; u) ?
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。2 H; k" h# |7 m. {$ [5 f" \

      z: g5 c; E5 u; g6 q5 v而加上内循环,光jmp和dec指令就至少多执行了6000个,慢个几十倍不是正常的么?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    8#
     楼主| 发表于 2022-9-25 00:46:56 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 01:09 编辑 # W3 a+ O4 D/ P; C$ a4 ~% q8 x
    数值分析 发表于 2022-9-25 00:20
    # I2 p- C$ p( C2 h这个不是这么比的吧。。。: Y/ l: J: u- {  s, u3 [! Z

    & R0 x; f0 x0 \2 E1 B5 _. \5 o您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    ) ^$ M% I/ e9 U8 T& r

    + Q0 e# j- m4 v" X2 _( l3 O! `有道理。
    : i: I+ f% ^. R$ q* e3 }8 a+ H所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,记得 numeric 库里有算向量内积的,我回头试试。" o; H+ |' {7 x& I% s

    * @+ v+ ^' P6 i( `: X# Z- t/ r我先尝试尽量用标准库,一个小程序,不想搞得太复杂。多谢了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    9#
    发表于 2022-9-25 01:27:53 | 只看该作者
    雷达 发表于 2022-9-25 00:46
    5 N0 p7 |1 [6 P2 I+ H; ^4 N有道理。
    4 p- \$ S/ |  X9 Q* h. ~所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,这大 ...
    0 H9 _: r2 a# l  s; z
    你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子,把循环本身翻译成机器指令loop或dec/jnz,两者速度上会差很多& l4 q( v7 j7 ^0 @* v& d) X  e
    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
    - x# i, ?* \' B* z2 G. w这个不是这么比的吧。。。8 p: ^( C3 T( D. z" k

    - [3 [9 v! {! }# o) L5 B您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    而加上内循环,光jmp和dec指令就至少多执行了6000个

    2 ~9 k# n+ C  f2 ]
    ) D5 v* @% g+ x3 l/ E5 I现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果循环这样跑,花不了多少时间。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2025-12-26 03:23
  • 签到天数: 1954 天

    [LV.Master]无

    11#
    发表于 2022-9-25 02:06:44 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 02:16 编辑 8 x  U- v$ I2 \+ F6 n2 ^+ l7 B# @: r# D
    沉宝 发表于 2022-9-25 01:48
      @7 }: @) d6 ^6 _5 e: Z现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果 ...
    , u8 Y6 M# C9 }- G9 Z, z8 a0 t! S
    6 B6 A( X; Z$ I/ |( O
    是的,兄台说的对。! i1 z8 S: u* U) Z0 H5 I

    6 G/ B# |& p$ R其实我想说的是 真正数值计算部分和代码中其他不直接计算的overhead的比值这个事儿。" R# k2 r1 i# X- X) L$ n5 o- R! G/ }

    % C! w# l! F, d! r! f, j雷达兄构造测试用例的时候,屏蔽掉了所有计算的部分,使得剩下的都是overhead,这样run time比较的结果就显得好像不合理了。如果把计算加回去,计算部分的run time会dominate,结果就不那么离谱了。因为不好说,所以用指令数对比的方式试图直观地说明这一点。
    2 h2 D% O+ C3 ~* w* T0 F6 I3 A) A3 A$ t& K: }: `8 ?1 A
    比如说,如果有计算,那么跑六千个循环相对于计算应该用不了多少时间。但是如果一边是什么都不做,另一边是六千个循环,那六千个循环比什么都不做慢几十倍了,就不是那么不合理了。* }4 w0 w8 y- u/ P6 t# @" b4 t0 `* B# z
    ( O( M0 t7 r( ^7 |) S
    当然也有可能像兄台说的,是优化参数的问题,但我觉得更多地是测试用例设计的不合理。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    12#
     楼主| 发表于 2022-9-25 04:47:43 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 04:49 编辑
    % r; P8 E; `/ m( _* ~/ \
    沉宝 发表于 2022-9-25 01:27
    & c3 H0 O! ~9 R& L" }你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子 ...

    : X2 s6 R, l) E6 @: H3 T5 J5 ~( I4 a# N5 V
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差一倍,我上面这个差的太多了。# T! }* e6 l. r

    2 F. R" L" N" k: i3 Q6 W' [我已经完全懵了。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    13#
    发表于 2022-9-25 05:51:23 | 只看该作者
    雷达 发表于 2022-9-25 04:470 D% b8 j2 w. J/ W" [) p
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...

    2 A4 ]! I1 f. M时间差一倍的结果可以接受。
    % @1 X0 Z7 D' X. K3 i+ I9 c4 [1 I$ U6 _- d9 \
    你还是用profile工具看看吧。现在大家都主观瞎猜。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2025-12-26 03:23
  • 签到天数: 1954 天

    [LV.Master]无

    14#
    发表于 2022-9-25 14:58:59 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 15:38 编辑
    3 F5 j- r3 C$ G  x+ Q/ d" f: l
    雷达 发表于 2022-9-25 04:47
    : p. L/ \' @0 q; u: ]4 ?又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...

    / V7 n" d6 i6 @/ D' P5 c
    $ e7 r+ E7 i" N  z
    & @- t5 L$ m) O6 X/ H- V1 L
    & u" _2 n! [0 N0 x) W  r. O能不能把这个也贴上来,看看和上一个有什么不同?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    15#
     楼主| 发表于 2022-9-26 01:30:03 | 只看该作者
    本帖最后由 雷达 于 2022-9-27 01:17 编辑 & d( U( u0 I% Q# m3 E, y
    数值分析 发表于 2022-9-25 14:58' f- O# k( T* v3 ?- p. @
    能不能把这个也贴上来,看看和上一个有什么不同?
    9 @: _+ D7 }3 I9 u1 L7 W9 v, U
    理了理思路,重新做了一个测试。
    8 w% M( D2 B0 J; G+ ?  g( |1 q做了两个 vector 和 两个 float *, 都长 100000
    ' T: v: J5 m( ?$ k  }6 r( U# I外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
    " v: f  K( w- I0 d6 V; `
    ) ?7 c' ]2 J7 B3 l. ~2 `内循环试了4种方法,
    6 I: ~* E% E" i) n; T1. 直接调用 vector inner_product 247s + k2 T+ |7 V4 k/ h' n6 i
    2. vector 循环点乘累加 237s
    / H- E# l- R( L* R; R3. float * 循环点乘累加 204s
    * X% ^/ f" r; L' ~4. 空循环 100000 次 202s
    ) k+ v2 p3 D; S& G( X7 k- j! v9 b3 s5 Q7 T+ q7 z) U) c
    不做内循环 200s
    5 ~5 [# V6 Q* z" _
    6 R. }: E5 d: y0 U  l; J- J& W  @8 s/ f你昨天说的对,内循环本身占比是很小的,大头在其他处理。
    2 I9 ~' Q/ D2 s另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
    5 C; \8 t8 c- A' |6 {; Z0 T+ Q/ L7 e7 y7 C$ U! Q2 g( `
    至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
    ) m: [) \) `# A+ {; A
    - x* d$ s0 P9 p4 u. h- T2 K(为什么下面我贴的  b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成  jj 好了,原来 方括号里的 i 是斜体标志  LOL)
    : m( K2 S5 b0 w# D; i4 ^: p4 l+ v1 T: q4 u9 N4 h
            std::vector < float > vec1(N);7 H/ s. l- p. i4 F
            std::vector < float > vec2(N);
    6 A* O  h7 y* x' e3 p        float* b1 = new float[N];8 a% O' l4 d' t: e  [
            float* b2 = new float[N];
    , i' c7 b4 H9 E1 i. K% V2 R; F% f' A! U6 N
            for (int j = 0; j < 6000; j++)
    4 j  s! z+ W9 j* W! @- w        {$ S. }) H3 m! ]( H8 P
                    std::generate(vec1.begin(), vec1.end(), []() {
    0 s: F% ?; E& A$ [$ `1 j$ M                        return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
    % h9 D) z& ^& E& Y                        });
    8 L, P2 o: h% Q3 |- E+ D: `- L7 Q, g% Z& d3 w  l, o
                    std::generate(vec2.begin(), vec2.end(), []() {5 @* y5 z  n- e! H; L; |
                            return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;5 m" T; }( l6 U1 u3 p; O6 R, l
                            });
    3 m1 h( q! V6 P! @/ u
    ) |8 R5 h, J( j6 H' y" R9 ?. f                for (size_t jj = 0; jj < vec1.size(); jj++)
      O6 _, N; T+ q  f; ?" i5 Y: L                {
    5 H# F$ n- ]  q2 j3 T9 B& {( ^                        b1[jj] = vec1[jj];
    9 F* R2 T9 m3 b6 J, ]5 F                }1 v$ P) c' V8 _5 A/ `4 k- Y
    # E5 ?) k5 r9 |, @' o0 Y3 f
                    for (size_t jj = 0; jj < vec2.size(); jj++)1 {( C8 v4 ?0 m1 m' R# |6 i7 r
                    {
    3 H- z- P6 K# ~/ n- F. [0 \. _0 I                        b2[jj] = vec2[jj];
    , U& U3 w. m# C/ g                }
    # {- U) E9 s' y2 \, a2 P0 R
    7 O2 m* E: h0 n                //Method - 1  N=100000 247s  1 Q" N2 S# N& S& ]0 l7 P) Z% r
                    //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
    3 W: E2 Q; x4 b' ~                                
    " s# b/ L4 ?: D  `( {* S$ _                //Method - 2  N=100000  237s
    1 l& h& ^+ L7 X6 U1 l5 p                /*
    ' r0 y& R# N5 |& P; ?$ F0 u                for (int jj = 0; jj < N ; jj++)1 O- }4 c8 o& R: M( K3 {
                    {. ~0 n1 R, Y; q
                            fresult += vec1[jj] * vec2[jj];( A; A& @- O8 P& Q! w) s
                    }
    " w0 J& a7 M7 R$ A) k                */
    6 Z* a' U& y4 @. u                                
    ' n, z) D) Q4 g4 n2 }" g8 K/ H                //Method - 3  N=100000 204s# q" W( `8 |! L( S/ R- s' V
                    /*% Y8 t, r( u% |
                    for (int jj = 0; jj < N; jj++)
    $ F2 h' f( a: J0 r                {. r3 G0 W5 n* R" _
                            fresult += b1[jj] * b2[jj];/ U* R. {# Z4 |( Z, U
                    }/ L/ m4 T9 r1 {5 S" g7 V
                    */
    2 k7 u2 m# t. @% e( Q% l5 A0 G, X! _/ ~7 I# D; R9 v9 X4 t
                    //Method - 4   202s
    4 \1 l# u! Y( `6 Y5 h3 U                /*
    0 w: N* K( ]5 r5 k" o                for (int jj = 0; jj < N; jj++)
    6 L7 ~4 u- _3 [) N* i. q* Z3 ]                {/ t1 f" ]4 A7 Q  v: n# I7 B$ K& B$ Q
                            9 r; A" B' Q+ U+ q# [
                    }1 q2 N! V% g/ g" }
                    */% G' l0 ^# P: d7 }+ ?- K4 n) y- ~) j
                    //comment out all methods, N=100000  202s                7 d; ~$ ?9 X* P0 k  D
            }
    : E) a& h& t' c4 i) ]5 i3 \. p0 c  @* _- H% y: \+ v" l( y
            delete []b1;
    $ x  e( Z. C7 ?" x. x        delete []b2;

    ; e4 Y1 ^/ k9 c$ Y" c
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    16#
    发表于 2022-9-27 00:15:38 | 只看该作者
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?5 r4 d5 m7 g9 D/ K, f; k

    " }5 ^! e2 Z1 {- e+ C7 m* p你第二个试验里面的j在循环里面又重新定义了啊,你确定真的跑了6000次?% S4 s7 `5 ~- j$ I4 ^
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    17#
     楼主| 发表于 2022-9-27 01:16:03 | 只看该作者
    机器猫 发表于 2022-9-27 00:15' r$ U; k6 }4 D5 _
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?- e5 x6 A8 C4 t# r: D9 Q% X

    1 t) }/ S" y+ q3 g你第二个试验里面的j在循环里面又重新定义 ...

    . K9 A* G5 R" y0 W- h" I" R8 @内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL
    + n4 b6 c6 G1 Y# Q" M' n8 R; r) ~5 p( E# y
    不和它较劲了,瞎耽误工夫,我已经转到 ubuntu, 也准备顺便试试 avx2 向量化。
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    18#
    发表于 2022-9-27 02:06:58 | 只看该作者
    雷达 发表于 2022-9-27 01:16" ?' G9 |8 v7 A; w0 F- d- t
    内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL
    1 v/ g/ f% x; E; Y2 ~+ U+ R$ \0 \8 T
    不和它 ...
    8 H: Y; l4 J2 g" z9 D$ ?
    . a6 W' J* u2 L: F0 B9 z" g3 n
    不过可以试试我说的register变量。前一个试验j是混在一堆其它变量里一起定义的,很有可能是在stack上,这样内存读写会更多,要是再碰上每次都需要加载cache就更慢了。4 s  x' E% I" @8 F/ _/ n7 p* F: Y
    后面一个是在循环那里定义的,说不定编译器就把它优化成register变量了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

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

    使用道具 举报

    该用户从未签到

    20#
    发表于 2022-9-27 20:29:50 | 只看该作者
    雷达 发表于 2022-9-24 23:54
    / ?$ X( l  ?" Q0 z  Y- tvoid xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    4 q8 r2 y/ n  Z( u$ y' o5 y{
    5 M9 ?' V* [& ]. v        comp temp, xtimesy;
    " A- E! I: C, G) `) y* @* f1 D
    这个code里面如果Openmp没有被注释掉的话,那么temp那个变量应该是定义在循环里面,否则线程之间会存在争夺写入那个temp的风险。; A; d) \' J8 X3 u" y7 X+ C
    内层for循环如果没有内部操作的话,编译时应该被优化掉了,和你完全注册掉整个循环是一回事。可能你的编译设置没有打开优化?
    ! D2 A8 i( Z' V) n: r; `' @. qVS社区版没有问题,我工作用的就是社区版,设置正常的话不会比商业版差。以前游说头头用Intel Compiler,他说不想花钱,而且差不了多少,就一直用到现在。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2026-1-12 10:18 , Processed in 0.039113 second(s), 22 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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