设为首页收藏本站

爱吱声

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

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2022-9-24 22:54:26 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
    C++ 比 Octave 慢好多,怎么破?4 k" t) @9 {) z/ }8 \! B
    & m* M  a, l; g4 O( c
    自相关两层循环,内层循环涉及浮点数计算,试验了一下把内层循环内部全都 comment out 只留个壳子,  但空的内层循环本身就把速度拉下来了,看来问题并不在浮点计算。
    " W6 v% k2 y* h: Y! o6 @2 I. n  Y) x+ I( F
    速度优化问题真的很有意思啊。
    " m! o& _6 _; h% l, c; k$ z) I7 q& \9 a- `- p
    欢迎大家继续讨论

    评分

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

    查看全部评分

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

    [LV.Master]无

    沙发
    发表于 2022-9-24 23:04:16 | 只看该作者
    拉下来?拉多少?
    & ^9 v' |3 \1 A0 v/ o# ^把代码贴上来看看?
    : k! i8 w! q7 d9 @, D, G* L& x6 }/ u% }: X# U: U& Y$ J
    难道分支预测不准破坏流水线执行?不该啊。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    板凳
    发表于 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 编辑
      R6 O8 I0 j0 ^+ {  w7 E
    数值分析 发表于 2022-9-24 23:04  e; \8 {0 t: C% Z0 o
    拉下来?拉多少?
    : v9 s* u$ _% T* B$ F) Q把代码贴上来看看?

    & d8 z7 y2 u7 K: M6 p& j! }% |) j2 i0 e& e- l% T3 J& n+ I0 v5 s
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    8 w! S  [' f6 @8 f3 }( z# ]{/ _0 T9 `0 [( z6 X& }. I! ?
            comp temp, xtimesy;9 ?# v0 |  m. O, i( o+ {7 p
            xtimesy.re = 0;
    6 F: g8 \1 b; t: _: a; i        xtimesy.im = 0;* \+ h9 r  a. h: U
            int j0 = lenB - 1;
    0 u! O: G5 c4 a7 U        int    i, j, i1, reali;
    ; i2 Y' f( m- C' A% y; [7 V$ L        if (lenA % 2 == 1)
    5 a0 g) Y4 g. E9 {) _, j3 I( ^/ ?7 F                reali = lenA + 1;& V( ~( z) [5 M! ]
            else
    ! U( H* D  ~5 q1 h- @# u                reali = lenA;+ ?% l7 m% A# K/ w, R
            reali /= 2;
    ) d( b& U7 O/ z, y
    * f! c- U0 n" j2 d0 i        int nconv = reali + lenB;
    5 c& V# Q! H6 _5 i1 c: t0 ?4 v        //#pragma omp parallel for0 `  r* o7 ^7 c
            for (i = reali; i < nconv; i++)
    # @/ R: r0 G9 s        {- G1 @0 Y$ |. q
                    temp.re = 0;
    3 _& E. V3 J; A" {( w/ z                temp.im = 0;3 k8 ~: ^0 X! o5 B" X. y
                    i1 = i;
    . k% z9 I) Z+ O3 O! X- r                for (j = j0; j >= 0; j--)! }+ m3 }! B2 q; Z+ B. o2 P
                    {
    ( Q: q9 Q/ U: N) ^" q: e/ |                        /* floating date operation */5 \. y  B7 f8 s, W
                    }

    ( h5 H9 c& G) U% ]        }
    2 L) [- D$ Z1 F}9 B8 i, m5 l4 g' ?

    6 x, j" s0 f; Jxcorr函数代码如上,comp是复数struct, 做过长度为11、19两个矢量的测试,和octave结果完全一样
    4 h: y+ g6 [: \4 q# m5 f5 _& {3 c
    9 i& V( d7 k( ]- c* O红色部分是内循环,现在其内部操作都comment out 了, j0大概是 6000。
    9 x' d# i& \1 F& Q3 q现在call xcorr 100次,耗时78s.5 m$ [4 P/ L$ }7 g/ u3 M

    * x/ [9 s/ @& }8 v如果把红色部分内循环本身完全comment out, call xcorr 1000次,耗时 <1s.
      c; u0 {5 c' x3 [# V) r; m0 x' F- `; P- E9 B8 z
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    6#
     楼主| 发表于 2022-9-25 00:17:17 | 只看该作者
    风雨无阻 发表于 2022-9-24 23:33
    0 t' L# `  X& \- v7 VMaybe Debug mode?

    ( s! u9 x3 k/ g& n  B7 A  R0 Y0 C; P1 D) J
    不应该,看我上面的回复。5 L& Y7 _, Y. Y6 F
    - r. V) l4 j1 D  r; q
    我更怀疑是 VS 社区版的问题
    回复 支持 反对

    使用道具 举报

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

    [LV.Master]无

    7#
    发表于 2022-9-25 00:20:10 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 00:24 编辑
    ) r/ M$ r: G! @# Z% Q
    雷达 发表于 2022-9-24 23:54
    # H3 W, T; {9 E+ z4 Z! Lvoid xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    # e  x1 S+ D9 V% u  N, b# P3 Y( P{
    * U* V  x8 |* z        comp temp, xtimesy;
    , w7 O$ ^8 Z/ ]9 ]2 B

    ) X* l5 l6 t) {3 _这个不是这么比的吧。。。
    8 b% K( _) C/ h( X6 |8 O" _. L7 \/ k! V& u; `4 _; S
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    # j% ^& ]: F# t; i
    : P. p% K% A) L2 C# i: ?( r! N7 ?而加上内循环,光jmp和dec指令就至少多执行了6000个,慢个几十倍不是正常的么?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    8#
     楼主| 发表于 2022-9-25 00:46:56 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 01:09 编辑
    + D, w, h7 d/ K1 s
    数值分析 发表于 2022-9-25 00:20
    , h0 U; L+ V4 v这个不是这么比的吧。。。; x# L5 I: ^- N' {

    / p4 o2 j4 Z7 q7 \! C$ H您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。

    4 M' L: C' ^: N' F
    ( W4 n: ]# f( P有道理。
    $ M$ z" {; F0 X  G) |$ v8 @1 k) [所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,记得 numeric 库里有算向量内积的,我回头试试。0 N" m! p% {$ Q" N" r! {4 l
    , J  r/ d% p  }# B% i
    我先尝试尽量用标准库,一个小程序,不想搞得太复杂。多谢了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    9#
    发表于 2022-9-25 01:27:53 | 只看该作者
    雷达 发表于 2022-9-25 00:46
    ) k) B  M# o1 x# S有道理。
    3 l4 ~& P4 ?8 U, _; S所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,这大 ...
    6 {5 c, U3 B6 L" ^/ E
    你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子,把循环本身翻译成机器指令loop或dec/jnz,两者速度上会差很多
    : U$ S4 w5 i4 ?7 x+ {2 `$ M6 v" 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, O4 g; @7 A, p
    这个不是这么比的吧。。。0 R7 R- D# l% [2 g

    ) e  m) j8 t% L- E您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    而加上内循环,光jmp和dec指令就至少多执行了6000个

    + D% E- w; M7 u5 v+ K
    ) K- j3 s$ G8 @: T+ z6 h: g现在的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 编辑 , ~+ g5 M$ D! e; h* Y3 I  {! N
    沉宝 发表于 2022-9-25 01:48) u. c: u# A. S; C" r4 N, H
    现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果 ...
    * }8 u0 J3 E4 @/ q. E& G9 Z
    / k( t# L7 G( A) f
    是的,兄台说的对。
    ! C( f) s. m6 ]2 M5 U4 X; G6 s1 m, g
    其实我想说的是 真正数值计算部分和代码中其他不直接计算的overhead的比值这个事儿。0 P3 x: T' |' Z$ H2 z8 ^
    ) I9 J  b' L2 Y0 d% _
    雷达兄构造测试用例的时候,屏蔽掉了所有计算的部分,使得剩下的都是overhead,这样run time比较的结果就显得好像不合理了。如果把计算加回去,计算部分的run time会dominate,结果就不那么离谱了。因为不好说,所以用指令数对比的方式试图直观地说明这一点。* o# j& n8 t9 `/ X3 p% `& g: N
    " q! ?% m' u0 }
    比如说,如果有计算,那么跑六千个循环相对于计算应该用不了多少时间。但是如果一边是什么都不做,另一边是六千个循环,那六千个循环比什么都不做慢几十倍了,就不是那么不合理了。0 P, I# H* v" B; H1 Z

    # C8 O+ y  [4 S) K' b5 Q* C当然也有可能像兄台说的,是优化参数的问题,但我觉得更多地是测试用例设计的不合理。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    12#
     楼主| 发表于 2022-9-25 04:47:43 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 04:49 编辑 6 s3 y5 j6 y3 L. T: {" U. U* t; I
    沉宝 发表于 2022-9-25 01:27
    7 T1 `8 U2 C$ h+ ?1 Q你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子 ...

    ' r7 h( D; m2 ~' b; M, b! A, j+ \2 \* `8 ~2 `/ {
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差一倍,我上面这个差的太多了。
    , m, C6 f& K! h& x' z# ^% i- v8 m" V. ^) O5 P# f! U: y
    我已经完全懵了。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    13#
    发表于 2022-9-25 05:51:23 | 只看该作者
    雷达 发表于 2022-9-25 04:47
    ) _3 b$ G6 S3 K0 V' q- E2 _又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...

    % O8 ^" ?. @4 X% ]" V# c8 S: o时间差一倍的结果可以接受。3 x+ }) p/ W2 q. b2 N1 |' E5 I
    : P2 o6 `* E4 ?+ C, ^# l: o
    你还是用profile工具看看吧。现在大家都主观瞎猜。
    回复 支持 反对

    使用道具 举报

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

    [LV.Master]无

    14#
    发表于 2022-9-25 14:58:59 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 15:38 编辑 8 e1 s, A& T: l0 ^# Y0 j6 }- J
    雷达 发表于 2022-9-25 04:47
    ( O" R4 I5 A5 I- S, c又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...
    5 b. M5 l/ d( k0 @6 J; x

    % h2 h- ~! Q  P0 o8 R4 c% y
      t$ o" g7 q: F5 s! U6 C2 F2 i% H' l( S) m7 l
    能不能把这个也贴上来,看看和上一个有什么不同?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    15#
     楼主| 发表于 2022-9-26 01:30:03 | 只看该作者
    本帖最后由 雷达 于 2022-9-27 01:17 编辑 - ~1 T, g2 K7 v+ b2 C
    数值分析 发表于 2022-9-25 14:58
    , V: N& E4 o) C' J/ o) I  F能不能把这个也贴上来,看看和上一个有什么不同?

    1 H/ T* ^; `3 i0 j" V& H. L理了理思路,重新做了一个测试。: n. ^4 p2 m; y0 e/ c
    做了两个 vector 和 两个 float *, 都长 100000+ c& ?5 P4 t3 p2 {) |- o
    外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
    , W4 H  I' G3 l2 V/ ~: z3 }1 \# `& Q$ E/ p
    内循环试了4种方法,
    ! g+ S! v7 w- A8 ^" G! e( t1. 直接调用 vector inner_product 247s
    " n# \3 m5 Z) _2. vector 循环点乘累加 237s0 y" D0 r: O7 \! o8 ?4 w, \- |
    3. float * 循环点乘累加 204s
    % K) n/ i( |. f0 I3 x& Y. i5 h3 F) V4. 空循环 100000 次 202s0 S% `: w' Y; H5 M1 {9 W$ ~

    . i1 Q  [# c, v; o' B不做内循环 200s7 e4 h2 ?5 J, i1 X% g0 E$ p* W
    : y% W& i. W7 p! @& B' s1 W
    你昨天说的对,内循环本身占比是很小的,大头在其他处理。
    3 D" i* I! k+ A' {: l7 E另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。6 m9 M! A5 B5 [" j( e* j3 l
    $ J- V8 O4 g+ W9 @# \
    至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)% [+ K7 A# b1 l- {& J$ u

    * l( n" `$ t3 a; I(为什么下面我贴的  b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成  jj 好了,原来 方括号里的 i 是斜体标志  LOL)
    ! M  n& K; g7 b% t
    + u- f9 q. V# ^% c: o
            std::vector < float > vec1(N);3 |1 T. z0 m' S& n0 B" L: S0 w
            std::vector < float > vec2(N);
    # H$ d2 @+ B( A% V7 z8 L6 b5 ?: l        float* b1 = new float[N];1 n" {: R' U2 F. l* C' j4 G
            float* b2 = new float[N];
    # i! y* A" }/ p4 i3 ]8 F& i' F- x
    " W0 t4 e5 s) N# o, j        for (int j = 0; j < 6000; j++)$ A/ L6 `9 a5 k& o- |# U
            {' t, i/ Z* w7 y8 @8 V* ]2 K
                    std::generate(vec1.begin(), vec1.end(), []() {
    0 E: R% h5 K3 X; D6 @8 u7 r" b                        return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
    8 ]5 j% e9 G  e: j                        });
    8 K% S! e3 W' _# n- v5 C
    1 G: I5 i4 ]+ w1 p4 X2 e' g9 q                std::generate(vec2.begin(), vec2.end(), []() {
    ' x# E- v8 ]# N9 ]  F                        return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;) q8 X% [1 [. a3 M7 U1 p: U
                            });
    ) R: l  |$ c$ x/ u8 W2 y
    + [4 W1 D/ A$ n# y! l( o                for (size_t jj = 0; jj < vec1.size(); jj++)
    ! P. o  h3 f9 l4 ~                {" q* O: H* v7 C7 `: ^* a
                            b1[jj] = vec1[jj];1 L4 j0 \" |" Q1 n( P
                    }, T$ U  Z3 H$ y

    9 w8 p1 t/ y) p5 n3 n                for (size_t jj = 0; jj < vec2.size(); jj++)# V  ~6 e4 U9 o! A4 C6 A0 [
                    {+ b; A) A! }; X7 k
                            b2[jj] = vec2[jj];4 D1 r3 I$ Y" C
                    }( \* y* _7 C( ~2 ~, G  P
    ! ^' M4 S( f' L4 I+ N2 ^* I1 T" ^
                    //Method - 1  N=100000 247s  
    6 z. i6 ~2 s' n7 o  w) C                //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);. e) m; @. ^- U2 s
                                    
    7 N* W+ ^# o2 M0 x+ {                //Method - 2  N=100000  237s
    ! K4 j+ O2 b, F2 |% a" [                /*
    : H( I& Q0 @1 Z3 [3 g! o0 B                for (int jj = 0; jj < N ; jj++)
    6 n% M, ?0 \, r1 k' Q0 f) B                {4 k5 A& y) K; x0 f5 Y/ |  X
                            fresult += vec1[jj] * vec2[jj];; D, \" V2 Q3 H: g# \0 m
                    }
    & y2 r. w8 E% {                */$ C& W( Q& T3 N3 P5 `0 u2 \
                                    4 W4 \: s/ q# g; d* c
                    //Method - 3  N=100000 204s7 ]( u0 x" a7 |4 f3 S
                    /*
    ' {" i: g. P' D3 b$ s' x                for (int jj = 0; jj < N; jj++)( n1 t7 o0 F4 n9 b8 W' d" b8 j8 \' V( O
                    {
    " [6 \% J" [1 T1 T                        fresult += b1[jj] * b2[jj];
    2 D8 z6 |/ @& P; @; C" \                }$ b7 W0 A4 s5 W8 Z( T4 D  }
                    */
    8 `! r+ t, t, p5 }* t% u9 z( c
    $ G& I. `" s1 ^9 y                //Method - 4   202s
    6 E* {7 G/ k# Z+ J) }; T: N                /*
    * G# H9 X3 h( d5 g+ f2 _" k                for (int jj = 0; jj < N; jj++)
    ! [, \1 Y$ u3 l+ L4 A% d; f                {
    4 U  a/ A3 Q' [6 O9 T( d                        1 x- o9 ^3 K2 ~) ]1 n4 d( B0 d3 Y
                    }# ^4 G- H. |6 K1 X
                    */% Z4 ]0 Q+ Z4 Y. a/ \, p6 T
                    //comment out all methods, N=100000  202s               
    + G8 L8 ?2 P. r        }
    % a7 n4 l+ D% ~/ J- ^! a' K* L5 F
    7 t. v7 a- |# I7 v5 N2 p" \- W        delete []b1;
    ! }1 ^' k. C( a3 ]) @! ?  j3 y8 D4 k2 |        delete []b2;
    ( z9 C  t2 Z. i7 g3 c
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    16#
    发表于 2022-9-27 00:15:38 | 只看该作者
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?/ _4 h' c6 _/ @, |( H; Y

    8 r9 A& A) ]- p4 D% j你第二个试验里面的j在循环里面又重新定义了啊,你确定真的跑了6000次?$ Y9 \* i  o) w3 i) ]# p7 J
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    17#
     楼主| 发表于 2022-9-27 01:16:03 | 只看该作者
    机器猫 发表于 2022-9-27 00:156 ?" s. e: F" p& B- @2 a  d' q" L8 M7 I
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?- r5 l0 Q3 D% L, \  M

    # E* B6 @; _  o9 V" @" V; G你第二个试验里面的j在循环里面又重新定义 ...
    ; L, R7 X. p$ w* M) W* \8 S: `! C8 ^
    内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL
    : B0 ]4 i$ C' F9 b* D' A) s+ ~  l& R, K: u$ D8 }# ?7 G7 d
    不和它较劲了,瞎耽误工夫,我已经转到 ubuntu, 也准备顺便试试 avx2 向量化。
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    18#
    发表于 2022-9-27 02:06:58 | 只看该作者
    雷达 发表于 2022-9-27 01:16( u" l4 v  C/ D- z7 p
    内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL
    / L0 V" i6 n8 V. Q2 p$ _# y! H
    ( V/ w: l0 ^5 q+ S6 u$ m不和它 ...

    ; j& z; i* Q; M7 g2 V) g' M
    0 Z( a0 v9 ~$ u4 {# ?不过可以试试我说的register变量。前一个试验j是混在一堆其它变量里一起定义的,很有可能是在stack上,这样内存读写会更多,要是再碰上每次都需要加载cache就更慢了。, ^3 {4 T& p3 \. ^) e
    后面一个是在循环那里定义的,说不定编译器就把它优化成register变量了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

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

    使用道具 举报

    该用户从未签到

    20#
    发表于 2022-9-27 20:29:50 | 只看该作者
    雷达 发表于 2022-9-24 23:54
    0 s! w/ P% p8 h3 L& avoid xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)) G9 N. t- q7 s- F: A  G6 |( U
    {
    : V& R4 e6 b: D) N: R2 ]        comp temp, xtimesy;

    ( E2 i; r" ?- j" ~& j2 W这个code里面如果Openmp没有被注释掉的话,那么temp那个变量应该是定义在循环里面,否则线程之间会存在争夺写入那个temp的风险。
    . @  e6 B. N( e: n+ I内层for循环如果没有内部操作的话,编译时应该被优化掉了,和你完全注册掉整个循环是一回事。可能你的编译设置没有打开优化?5 {" I. T/ ^& }0 }$ ^. d
    VS社区版没有问题,我工作用的就是社区版,设置正常的话不会比商业版差。以前游说头头用Intel Compiler,他说不想花钱,而且差不了多少,就一直用到现在。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2026-3-18 17:59 , Processed in 0.069475 second(s), 19 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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