设为首页收藏本站

爱吱声

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

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2022-9-24 22:54:26 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
    C++ 比 Octave 慢好多,怎么破?2 i" X8 g7 x# J. f2 `' n

    # I% [$ R. P. d自相关两层循环,内层循环涉及浮点数计算,试验了一下把内层循环内部全都 comment out 只留个壳子,  但空的内层循环本身就把速度拉下来了,看来问题并不在浮点计算。
    + ^, V: H6 {2 B2 o; s- A5 b& M
      S9 k7 n: m: f0 `3 h/ I6 n8 W8 X速度优化问题真的很有意思啊。: _6 {, k5 G6 m
    & j) o  X1 V! [% V3 ]% p; Q5 R7 _
    欢迎大家继续讨论

    评分

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

    查看全部评分

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

    [LV.Master]无

    沙发
    发表于 2022-9-24 23:04:16 | 只看该作者
    拉下来?拉多少?
    # H7 X5 F! I5 `0 W9 @  \把代码贴上来看看?" I( j- i3 r8 v+ O6 ~/ i

    / h& |4 `. D8 e! |7 |7 ~9 t难道分支预测不准破坏流水线执行?不该啊。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    板凳
    发表于 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 编辑
    5 I& O2 O/ m* B# `! N
    数值分析 发表于 2022-9-24 23:04# i7 ^' l1 C; n: O$ D
    拉下来?拉多少?) T# i2 @$ @$ E+ R' N8 E
    把代码贴上来看看?
    9 g; e* @- @! P8 N
    / T% W" K" i4 R5 ?
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)% _4 w$ P. g0 t9 G3 l. f
    {
    4 Y% Y" G% f% O        comp temp, xtimesy;
    + b/ w6 b% q  U/ I- \4 K9 Q        xtimesy.re = 0;% R3 D7 D" t  x3 T  \& d
            xtimesy.im = 0;
    # V( M9 {# \- g/ J        int j0 = lenB - 1;
    5 n1 B& n; s2 D/ O: y; C+ _        int    i, j, i1, reali;# k  O! v' s3 @# q
            if (lenA % 2 == 1)% C1 G/ d0 p: H  F6 m3 ~
                    reali = lenA + 1;* ^9 G% y5 W5 S: ^8 S+ _" [1 M
            else
    / i% ^) ?9 ]- U, u( `                reali = lenA;
    % e% I% ~7 t! P3 ~8 B4 R        reali /= 2;
    + X: M' B: u; Y  g: i
    " O8 I" D0 N4 t! J4 E: _6 M: [        int nconv = reali + lenB;  {/ r- V/ p% U5 k
            //#pragma omp parallel for! n' o" u, |& H5 z  e
            for (i = reali; i < nconv; i++)
    " N& U# r6 q2 j. O        {, J3 l- ?- E/ v* e8 W7 k
                    temp.re = 0;0 ]  ^; T2 n9 y9 @( u$ n1 k
                    temp.im = 0;
    ) ^; c( ^3 e( P5 J                i1 = i;
    & e8 [  k6 m' b0 P( K                for (j = j0; j >= 0; j--)$ T: V+ Z# y4 R% A; W' c- N+ O( A1 P
                    {
    # a4 B2 o# v. ~, k9 v5 M7 s! z                        /* floating date operation */! i5 h( k% ?1 G+ J0 j- T
                    }
    * g+ N) M7 f0 z, i# ~0 ]- V; J* V
            }# R2 d3 E# D! Z% X
    }$ z* Q9 l! G+ |7 {- Z1 i" p/ c
    : Z' e. H- Z* K* ~) l5 h
    xcorr函数代码如上,comp是复数struct, 做过长度为11、19两个矢量的测试,和octave结果完全一样
    + s$ n1 ]2 W( d2 [" X; A" e& N4 d7 ]) I4 [6 q% K. h4 F+ l! P
    红色部分是内循环,现在其内部操作都comment out 了, j0大概是 6000。2 F5 s* h, B5 b4 t2 f2 i
    现在call xcorr 100次,耗时78s.+ @4 B& t9 _) \, n
    " G; r4 j' |/ T0 Y/ u, j+ `
    如果把红色部分内循环本身完全comment out, call xcorr 1000次,耗时 <1s. % Y6 e, h0 C, W9 P% [8 E
    ! t0 O$ r  p  Z# I- u7 o( ^
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    6#
     楼主| 发表于 2022-9-25 00:17:17 | 只看该作者
    风雨无阻 发表于 2022-9-24 23:33
    , {6 B! e' b2 L- e- [Maybe Debug mode?
    / r0 D' {, Z, J& [( Z

    2 C4 q1 A5 O1 X  n, {" |6 `+ |不应该,看我上面的回复。3 m& }. e/ K/ k. m) _
    ; C7 P8 j6 g  s
    我更怀疑是 VS 社区版的问题
    回复 支持 反对

    使用道具 举报

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

    [LV.Master]无

    7#
    发表于 2022-9-25 00:20:10 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 00:24 编辑
    0 G$ T3 F0 f9 d8 j* v8 h* {3 o1 N
    雷达 发表于 2022-9-24 23:54
    + Z  q; }0 _' \! T) s4 zvoid xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)9 g  L. n5 W( K* r1 F
    {
    3 ~) y% z" O$ p3 C* d1 s: Z        comp temp, xtimesy;
    # g" X  l3 j+ B9 }' P2 N
    " W4 x# N4 q9 R3 Y1 k) M8 X/ z9 G2 ?
    这个不是这么比的吧。。。* G) o' u2 E% M8 N

    & Y; _3 T3 ]8 R: r* Z: Z; j6 z您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    $ y, i; V4 P, _
    5 _( w. Q& ]0 H4 U: c5 Y而加上内循环,光jmp和dec指令就至少多执行了6000个,慢个几十倍不是正常的么?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    8#
     楼主| 发表于 2022-9-25 00:46:56 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 01:09 编辑 5 _+ |7 ~# d3 l% b
    数值分析 发表于 2022-9-25 00:20
    ( ~8 k- K1 K4 ]- u这个不是这么比的吧。。。6 q" ^; r" P' M9 `( J" G$ z* L

    . ^6 o) |- b2 S您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。

    % a, R% c0 W% d, e. R6 a% Q2 {; t5 v, \6 p* A# h
    有道理。' Y1 M) i- A, ]3 ]2 S' P+ L( }& E6 L
    所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,记得 numeric 库里有算向量内积的,我回头试试。+ M! {7 x, r9 ?2 _$ M- U; d3 n! S

    , g0 |2 U! G" ?2 c$ h/ @我先尝试尽量用标准库,一个小程序,不想搞得太复杂。多谢了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    9#
    发表于 2022-9-25 01:27:53 | 只看该作者
    雷达 发表于 2022-9-25 00:46
    $ H, ~9 l# P9 ~' {3 v, J有道理。% p4 a+ @1 j1 S( H
    所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,这大 ...
    ! t- S* b- L9 Q6 j! b$ @3 @
    你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子,把循环本身翻译成机器指令loop或dec/jnz,两者速度上会差很多4 D4 q- D: d  Y8 q) S
    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/ [2 W0 D9 N8 Z; n6 J% p5 P3 @5 M
    这个不是这么比的吧。。。
    7 H  ]' H3 p9 u0 S* g# V# u; v) B: p# z/ f& M, O
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    而加上内循环,光jmp和dec指令就至少多执行了6000个

    3 g: j5 S0 k; w+ J9 S: \, t
    2 d) G2 z2 c: Q2 B$ t7 C现在的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 编辑
    " W; O# z& A* a( Z( P& P8 Q7 H
    沉宝 发表于 2022-9-25 01:48
    8 F+ O' \7 \2 s2 r现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果 ...
    - V+ P; i  K7 Z. Y( }0 W1 _) M
    ' b. p  E+ Q3 y4 J* i, V& t
    是的,兄台说的对。3 W6 `; E% \; w, j: k+ e* o# \

    7 [& z% s3 o7 W) s, I5 Z4 b其实我想说的是 真正数值计算部分和代码中其他不直接计算的overhead的比值这个事儿。
    ) D3 M8 z* C) Y# K' Z3 l" j3 ]7 |  o) g8 o# L+ w; H: L- r
    雷达兄构造测试用例的时候,屏蔽掉了所有计算的部分,使得剩下的都是overhead,这样run time比较的结果就显得好像不合理了。如果把计算加回去,计算部分的run time会dominate,结果就不那么离谱了。因为不好说,所以用指令数对比的方式试图直观地说明这一点。
    4 ^( S3 ]5 t% a+ U& I9 A: E: N0 U+ ]- T8 }# V
    比如说,如果有计算,那么跑六千个循环相对于计算应该用不了多少时间。但是如果一边是什么都不做,另一边是六千个循环,那六千个循环比什么都不做慢几十倍了,就不是那么不合理了。+ d# {" G: t5 g2 a  s

      @! s, B- K, W0 k# W; \: M当然也有可能像兄台说的,是优化参数的问题,但我觉得更多地是测试用例设计的不合理。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    12#
     楼主| 发表于 2022-9-25 04:47:43 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 04:49 编辑
    3 T, P& A# a+ O: U5 w
    沉宝 发表于 2022-9-25 01:27' s. w8 ]# Z; b7 Y0 Y" ^  c
    你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子 ...

    1 M, w) |4 S2 T. O" g6 M7 ~
    , {; L" S+ k5 o) {: r1 [) o6 I又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差一倍,我上面这个差的太多了。
    % e  F  Y. B2 o/ n5 s6 W1 x
    5 o0 ^4 T$ d: K7 V7 l我已经完全懵了。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    13#
    发表于 2022-9-25 05:51:23 | 只看该作者
    雷达 发表于 2022-9-25 04:47
    . v7 m! j  M( d: Z& F) z* {又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...

    9 Z  B+ v6 h& @8 ]. w) {+ t2 n时间差一倍的结果可以接受。/ E# g- n6 i; M

    * ^! W# L9 v5 V6 V, u, `你还是用profile工具看看吧。现在大家都主观瞎猜。
    回复 支持 反对

    使用道具 举报

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

    [LV.Master]无

    14#
    发表于 2022-9-25 14:58:59 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 15:38 编辑 ; b9 n" a. ?2 S& R/ x) D, W
    雷达 发表于 2022-9-25 04:47
    $ R8 n: @( D* ]2 V又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...

    & S, `7 u4 _' Y0 I
    7 b7 p0 y/ C+ s" x: [" [* Y2 S- @& H5 I9 o- }$ z( f" E2 X* _

    1 c3 a. [' d1 Q* X% e0 @$ x+ s能不能把这个也贴上来,看看和上一个有什么不同?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    15#
     楼主| 发表于 2022-9-26 01:30:03 | 只看该作者
    本帖最后由 雷达 于 2022-9-27 01:17 编辑 & }# T$ \; Z) ?" T
    数值分析 发表于 2022-9-25 14:58
    0 T$ {# }+ s5 `, {! V能不能把这个也贴上来,看看和上一个有什么不同?

    ) ?9 d* f4 {& ^. y# Z6 z% d理了理思路,重新做了一个测试。0 W, k! M. ]* l! t0 X" q
    做了两个 vector 和 两个 float *, 都长 1000001 q6 N( h5 O9 Q* U
    外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
      Y7 F/ |4 B1 D" T; \: @
    * [8 P' x+ l' R* n$ J内循环试了4种方法,7 Y# y3 N6 Q& D' @/ S6 D5 K
    1. 直接调用 vector inner_product 247s ! s1 |; v+ y. M$ C
    2. vector 循环点乘累加 237s3 j  g% N7 T6 ]( q, F) Z
    3. float * 循环点乘累加 204s# [. F& _4 u6 f! d
    4. 空循环 100000 次 202s, V, ?; D3 A( U& @' T
    5 P# e% g  D, y3 @* |5 N0 c+ H
    不做内循环 200s
    . |8 ]" n" Z: p" @; z9 g8 n; c( F
    你昨天说的对,内循环本身占比是很小的,大头在其他处理。' Q  ?0 D9 B9 ~* Z; v
    另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。/ Q! ?# m0 s& ^( ^8 ]/ P8 ?# \

    8 v( W" a7 I2 h: G/ z/ z' N+ q: a至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)' O* l; D% ]) u8 i5 a
    ( F/ E; n2 l4 `
    (为什么下面我贴的  b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成  jj 好了,原来 方括号里的 i 是斜体标志  LOL)
    4 e$ B# q1 j  Q
    + X- p% z6 M" O4 t" [  |
            std::vector < float > vec1(N);$ G" T* F6 @2 \( W
            std::vector < float > vec2(N);; H# }- l( U  M+ N
            float* b1 = new float[N];
    / c/ t+ R' N( c        float* b2 = new float[N];+ b( @7 P/ I9 R  y

    / i- [  t( F$ P! r+ d        for (int j = 0; j < 6000; j++)
    * l! s$ _7 N8 @* ?5 S# x% e! F2 Q5 i" n        {5 [, q* H, e; m2 A  W  j; O/ c+ j
                    std::generate(vec1.begin(), vec1.end(), []() {$ D# n3 O% Z8 R7 i5 H: I
                            return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;% k; u# F5 n+ f$ `) s9 Y" T- Q; l$ t! i
                            });
      }, c) s0 u, o, L
    2 ^8 L, z2 ]  ?$ J) U% o& Y                std::generate(vec2.begin(), vec2.end(), []() {
    7 Q* \8 U+ ^9 A! s5 B; i                        return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;( v* e# G! y& \* N3 R7 \" t) D4 O% w- B
                            });7 n7 F4 i7 F, r+ ]8 {0 ?

    4 w4 q; V6 r3 h( G) b5 w/ {0 Q                for (size_t jj = 0; jj < vec1.size(); jj++)
    ! I8 M1 j1 R1 @, P, z0 D! B+ X# |6 f) \                {
    , N( E) o" H6 g. {( S$ [                        b1[jj] = vec1[jj];8 s/ s  f8 |: e+ r! H, ]) N8 k
                    }6 j  e- h1 G5 J0 E0 s

    ! u  v% g. J3 S: v0 ]) [* o                for (size_t jj = 0; jj < vec2.size(); jj++)! a. g- g3 }) S  X7 ?; A" _5 Y8 k
                    {& s8 a: f# p* P& W+ b2 V; E
                            b2[jj] = vec2[jj];9 X0 _6 f! p" Z; b: M( y
                    }
    / X: q) V' v* A9 [; J8 J; I- p& E; J
                    //Method - 1  N=100000 247s  ' W  I8 z' y' \9 M
                    //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
    . [& _: |; }& {7 s8 T                                
    & N3 S* d7 d5 Q# T9 c                //Method - 2  N=100000  237s1 }7 r+ C- ~. N& V# \9 K, C
                    /*
    7 I0 t: j5 o6 {# Q" z( E                for (int jj = 0; jj < N ; jj++)- H$ e3 A( p. X4 X6 t/ c
                    {5 l. H0 z& s% E% ?; V
                            fresult += vec1[jj] * vec2[jj];
    6 R, r+ t  z; G2 X2 ?4 ]                }
    7 R1 n! t! n  ?6 D% c. D7 j                */! E; ~7 w& ?# N$ J
                                    
    ) `" k  B7 @& R5 R! G9 n                //Method - 3  N=100000 204s7 \  D# X2 c' V8 L* L9 i; T
                    /*
    8 m( R( X9 G% I9 }( ~6 j/ ?  h# o- j                for (int jj = 0; jj < N; jj++)
    * }8 S( |" `* Y! N; S/ g, V  S                {: h- v1 P1 V. v* c- \
                            fresult += b1[jj] * b2[jj];
    ; f# ^: e! e/ i: i* I7 Y                }3 _' C. Q! A8 S& q5 [3 r
                    */
      U- b5 Y% k3 o# @# k5 H/ [. R7 [; Q: o$ u% m/ W$ H% Y" @* ~
                    //Method - 4   202s
    " w  B) J% N0 G' Y                /*7 ~/ R" {: i; T8 @1 B" I
                    for (int jj = 0; jj < N; jj++)5 p6 n1 E! I. I( H% l. e8 e
                    {
    1 \$ o4 h& k9 j+ k, t, ^) e                        / }, U8 I& y7 X/ x5 E! D
                    }
    4 [7 R9 J* i: ^3 n: i                */' Y' l! j* D) T" x- x
                    //comment out all methods, N=100000  202s                ' w! _1 _- [$ a. B; w* s3 M
            }8 i2 F2 r! |+ w: m
    / O. n: q( r6 _; _- h, H) w
            delete []b1;3 T0 L! _0 X% U$ P1 d" p- W9 H( B
            delete []b2;
    - M, p5 b1 B- A
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    16#
    发表于 2022-9-27 00:15:38 | 只看该作者
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?2 H5 O2 i- O7 @" T
    4 d, M/ R$ d/ V
    你第二个试验里面的j在循环里面又重新定义了啊,你确定真的跑了6000次?
    3 B5 z' y' P. q! V: v. L+ k
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    17#
     楼主| 发表于 2022-9-27 01:16:03 | 只看该作者
    机器猫 发表于 2022-9-27 00:15! H3 B$ a9 Y+ y5 H
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?
    7 D+ G4 J9 S% C/ p" |! H0 H
    ! T/ k0 {4 u1 A' h- e. w你第二个试验里面的j在循环里面又重新定义 ...
    % b( D( k2 A6 `! m, W
    内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL, m( c6 A" a, t* ]1 A: ?4 J
    ) a+ n1 V$ U& @8 e, \/ [
    不和它较劲了,瞎耽误工夫,我已经转到 ubuntu, 也准备顺便试试 avx2 向量化。
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    18#
    发表于 2022-9-27 02:06:58 | 只看该作者
    雷达 发表于 2022-9-27 01:16
    : U5 e; X! H3 H+ Z9 ]* |内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL
    6 j! u# W) v* ?6 z) ?2 Y, v* V" ?8 ~1 O5 t# F# }
    不和它 ...

    $ j3 e/ D9 i' t  X& l8 m; c8 y* |% p7 m; D+ s/ t) J8 T
    不过可以试试我说的register变量。前一个试验j是混在一堆其它变量里一起定义的,很有可能是在stack上,这样内存读写会更多,要是再碰上每次都需要加载cache就更慢了。
      i2 ?) F" @6 Q, x; v- A8 r后面一个是在循环那里定义的,说不定编译器就把它优化成register变量了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

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

    使用道具 举报

    该用户从未签到

    20#
    发表于 2022-9-27 20:29:50 | 只看该作者
    雷达 发表于 2022-9-24 23:54
    & c0 \* V9 ~6 x7 U& K9 |; m! d7 _void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)& G% {9 V1 L8 }* M! W+ H7 }, G
    {
    ( H% s- }" Q, N        comp temp, xtimesy;

    # N+ }7 [: B+ U, O这个code里面如果Openmp没有被注释掉的话,那么temp那个变量应该是定义在循环里面,否则线程之间会存在争夺写入那个temp的风险。
    5 D3 W% ?: y7 \  w* ?内层for循环如果没有内部操作的话,编译时应该被优化掉了,和你完全注册掉整个循环是一回事。可能你的编译设置没有打开优化?5 K* T( l) D$ {0 Z5 S- }
    VS社区版没有问题,我工作用的就是社区版,设置正常的话不会比商业版差。以前游说头头用Intel Compiler,他说不想花钱,而且差不了多少,就一直用到现在。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2026-6-22 23:12 , Processed in 0.074956 second(s), 19 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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