设为首页收藏本站

爱吱声

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

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2022-9-24 22:54:26 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
    C++ 比 Octave 慢好多,怎么破?
    - J3 I. Q( G. S. C& g3 G" ?' J1 c1 z" N( q  r7 `4 _; @( |& {
    自相关两层循环,内层循环涉及浮点数计算,试验了一下把内层循环内部全都 comment out 只留个壳子,  但空的内层循环本身就把速度拉下来了,看来问题并不在浮点计算。2 y- V8 P) N. l

    + K$ l/ A. O# A速度优化问题真的很有意思啊。
    3 W  l8 Y. x3 o  d3 G! h/ Y$ w' |9 ~7 C2 Z% w: s. Z) m7 C4 i
    欢迎大家继续讨论

    评分

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

    查看全部评分

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

    [LV.Master]无

    沙发
    发表于 2022-9-24 23:04:16 | 只看该作者
    拉下来?拉多少?  \  ^- r- h5 M, q( ^2 @
    把代码贴上来看看?
    3 Q+ i9 g' |8 p* h4 A# d
    : y$ w6 I6 f/ n+ [% s6 ~难道分支预测不准破坏流水线执行?不该啊。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    板凳
    发表于 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 编辑 3 X& I' D/ c. K( t" h, @8 X- e
    数值分析 发表于 2022-9-24 23:04" N" K. Z, p' s* z: W* i
    拉下来?拉多少?
    * D$ w5 r+ q' m. v. U' m把代码贴上来看看?
    9 x, ]2 \2 y; ^& D
    1 s8 ~. z* ^* U5 R
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)' s+ U- a3 w1 Y2 \" h
    {
    ) d$ I0 J9 @2 l+ W        comp temp, xtimesy;0 T/ U( i! e, B- x* E
            xtimesy.re = 0;
    " ?) R8 l. ^8 _- b5 [& _8 f        xtimesy.im = 0;. P% }( M2 O$ O/ t/ c* g) h* i
            int j0 = lenB - 1;$ g3 Z. ?9 J( R5 R0 T9 U2 c& y
            int    i, j, i1, reali;, U5 K( H, y* p+ l& `2 j# p2 u. n, ^
            if (lenA % 2 == 1)8 @8 h7 V# F0 S# k# D. p
                    reali = lenA + 1;! U( b# f) T" d8 x$ `- p/ ]: T
            else
    - K, z! Y6 x: y, Y                reali = lenA;
    $ R- a1 q8 R4 i) P" p3 d% M% Y        reali /= 2;5 k( ^5 x* J6 H: B) l
    8 C. k8 {4 Y5 Q
            int nconv = reali + lenB;
    ) i) e7 T5 C. e        //#pragma omp parallel for$ {! V0 z$ B4 ?+ G/ R' s
            for (i = reali; i < nconv; i++), f& f# A3 Y& Z( ^* r( Y
            {
    . t( h& U# @7 a6 a8 E9 I: ^+ Z                temp.re = 0;. H. j1 |: }. |  }# r
                    temp.im = 0;% k7 m1 k( R  i' l7 ~
                    i1 = i;
    ! ^# Y5 z3 }& f. ~% u                for (j = j0; j >= 0; j--)( L* B1 W0 ]2 w+ [& P; j& }, U
                    {
    $ u5 I0 Q( U+ J- u0 D5 b' l, a8 ^                        /* floating date operation */
    * |$ p5 |# ~4 o* b8 i4 T                }
      L# I# {6 A1 {4 x8 Y
            }
    % c0 }- d& Y. C+ A5 O; n! C, w}! A5 \8 M1 k% J& I( x/ C: {, D% @
    * A1 ~4 h( _( F% h
    xcorr函数代码如上,comp是复数struct, 做过长度为11、19两个矢量的测试,和octave结果完全一样$ F, b7 p: d" B: P# c' F( R

    , Q( H; ]' x2 c# u! e/ H红色部分是内循环,现在其内部操作都comment out 了, j0大概是 6000。: M5 A* ?! \& ?4 [6 L9 V; k
    现在call xcorr 100次,耗时78s.
    ! u2 k& H# U. Y/ o1 O" J+ n5 \1 a# f9 m$ m% A4 M! y
    如果把红色部分内循环本身完全comment out, call xcorr 1000次,耗时 <1s.
    # f6 D4 g8 t, Y3 j) }
    % p, N0 b) u5 G5 i0 |9 T
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    6#
     楼主| 发表于 2022-9-25 00:17:17 | 只看该作者
    风雨无阻 发表于 2022-9-24 23:33, Z* |' s5 J; e5 E9 M$ _6 N( I7 |: k
    Maybe Debug mode?
    $ X: q" D7 Y7 r/ |

    8 N0 F. V1 X. b, Y不应该,看我上面的回复。
      I2 s! v  n5 y2 F  o/ B7 v
    3 }( \  p4 e( }1 {& f5 Q2 u% l我更怀疑是 VS 社区版的问题
    回复 支持 反对

    使用道具 举报

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

    [LV.Master]无

    7#
    发表于 2022-9-25 00:20:10 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 00:24 编辑
    7 }+ h9 Z  k0 n+ s: H
    雷达 发表于 2022-9-24 23:54% V2 c7 d( D: f. y
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    3 d* [4 `1 `( P{) Y" A' h! K, D/ g7 q
            comp temp, xtimesy;
    * m8 O$ S, j' w- d' B1 z- t) V# U

    2 {1 {) S) F6 @$ `2 }  j$ B8 S: s. f4 L这个不是这么比的吧。。。
    3 ~7 v( n; x  L' p$ Z* _, U0 q  [8 j" p. i) V# T
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。) N7 _, w# B. u+ \# ]9 b4 ?

    2 R' w) l8 w0 ]' F7 _而加上内循环,光jmp和dec指令就至少多执行了6000个,慢个几十倍不是正常的么?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    8#
     楼主| 发表于 2022-9-25 00:46:56 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 01:09 编辑
    $ A5 F/ L% C' ]$ ~: P
    数值分析 发表于 2022-9-25 00:20
    ! L& p& i* ^/ B" E9 U: ?8 }3 P这个不是这么比的吧。。。
    0 j0 y" L6 p% f2 {4 F! u% r$ r7 ^8 ~
    9 k  _# `* R3 }7 u6 Q( k9 [您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    ; @' D' o; s; P' C9 F2 T( Z

    0 G2 Y! T2 L: a' A7 L; E6 S! Q有道理。. ]0 v1 t3 \& I7 f5 B
    所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,记得 numeric 库里有算向量内积的,我回头试试。) H1 t( J% m/ ^5 R: j( I  o* ~
    # \* q6 O8 U& ~3 s$ @
    我先尝试尽量用标准库,一个小程序,不想搞得太复杂。多谢了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    9#
    发表于 2022-9-25 01:27:53 | 只看该作者
    雷达 发表于 2022-9-25 00:46/ B. k; l' p( k5 ^8 }' W6 Z1 k
    有道理。
    - a( A" v0 F% M! {4 `+ X) J所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,这大 ...

    " a4 X, `, Q' f1 a; k- b你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子,把循环本身翻译成机器指令loop或dec/jnz,两者速度上会差很多
    - l5 g- V! f; E4 i+ J% Y. h; ~! `Why is the loop instruction slow? Couldn't Intel have implemented it efficiently?
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    10#
    发表于 2022-9-25 01:48:51 | 只看该作者
    数值分析 发表于 2022-9-25 00:200 O' `% ]1 ^; i- B. a1 ~. M9 I2 t
    这个不是这么比的吧。。。
    4 W0 g( [2 |4 _2 J
    1 `& g! E& j* V1 a您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    而加上内循环,光jmp和dec指令就至少多执行了6000个

    7 N  ~7 E5 \' `8 C' X/ `
    0 o6 _  k( D5 ]0 v% m/ 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 编辑 5 m& Z. @' h1 b5 o
    沉宝 发表于 2022-9-25 01:48, n# R8 V7 O. }0 J5 Y+ g" K
    现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果 ...
    : v" o' c8 C) S
    * a1 T3 ]1 T6 \# M0 }
    是的,兄台说的对。  m2 D( v/ F2 P2 w
    6 d  n& x9 {) m; N* k  h- @
    其实我想说的是 真正数值计算部分和代码中其他不直接计算的overhead的比值这个事儿。
    9 T* a* R: ~" T! U5 G! s( f5 M' @' l7 u3 u9 z; s( U
    雷达兄构造测试用例的时候,屏蔽掉了所有计算的部分,使得剩下的都是overhead,这样run time比较的结果就显得好像不合理了。如果把计算加回去,计算部分的run time会dominate,结果就不那么离谱了。因为不好说,所以用指令数对比的方式试图直观地说明这一点。  e% X* W- b2 e# m( {( P

    ( K+ S6 u' w3 m( }7 d比如说,如果有计算,那么跑六千个循环相对于计算应该用不了多少时间。但是如果一边是什么都不做,另一边是六千个循环,那六千个循环比什么都不做慢几十倍了,就不是那么不合理了。
    ' T- Y* c! _+ _+ @. e- h7 x
    . I" C- @/ v9 [, @* |6 S当然也有可能像兄台说的,是优化参数的问题,但我觉得更多地是测试用例设计的不合理。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    12#
     楼主| 发表于 2022-9-25 04:47:43 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 04:49 编辑
    , l" t( d: Q- g) C) _: e4 C8 Z
    沉宝 发表于 2022-9-25 01:272 q6 f/ ^9 c/ j5 Y; f
    你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子 ...
    % ?* C- @) v5 g% |2 R. o2 n

    7 f: l  Q) n4 U* K又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差一倍,我上面这个差的太多了。
    7 O8 {$ ?9 Y, v! |. c
    / G% ?8 j7 q# D! `9 G7 k$ r5 r/ M我已经完全懵了。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    13#
    发表于 2022-9-25 05:51:23 | 只看该作者
    雷达 发表于 2022-9-25 04:47
    7 u5 ]4 `+ G, m又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...
    . I2 Y1 ]  p) p
    时间差一倍的结果可以接受。
    6 [" x; E7 k0 v+ v
    2 y& M3 `% s7 l你还是用profile工具看看吧。现在大家都主观瞎猜。
    回复 支持 反对

    使用道具 举报

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

    [LV.Master]无

    14#
    发表于 2022-9-25 14:58:59 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 15:38 编辑
    % a7 ~6 Z2 S2 B% ^( ~" }- ]
    雷达 发表于 2022-9-25 04:476 s0 ~2 s( A& j5 d+ C. o
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...
    # t9 ~, c/ J, u. P, {

    7 [9 ?( f3 R, b- P+ |0 B' P$ l. K5 [/ C
    + _% G. W% ~5 c9 \7 O) I- y
    能不能把这个也贴上来,看看和上一个有什么不同?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    15#
     楼主| 发表于 2022-9-26 01:30:03 | 只看该作者
    本帖最后由 雷达 于 2022-9-27 01:17 编辑 3 X1 U1 L( Y4 Q; }0 g( C
    数值分析 发表于 2022-9-25 14:58
    . u" ~, D: t( i8 \$ Z能不能把这个也贴上来,看看和上一个有什么不同?

    & a/ m) p  A/ k- l理了理思路,重新做了一个测试。
    , l/ F8 s, c# y6 v: Q做了两个 vector 和 两个 float *, 都长 100000; S- d: v2 @, @4 v9 F6 x- q! z  H
    外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
    - o4 f5 a' h5 j0 {% n; i
    2 A9 ?% {7 t; P内循环试了4种方法,6 V1 k+ Q! F+ `5 `9 y& q5 _! P
    1. 直接调用 vector inner_product 247s 0 v* D4 J3 ^6 ~& ?9 I1 V* F2 k+ a7 f
    2. vector 循环点乘累加 237s5 O& P+ I+ b+ M) ~* N
    3. float * 循环点乘累加 204s) S7 A/ p; ?# u9 M
    4. 空循环 100000 次 202s* x, i5 A; _& m& i# `5 p

    . i1 \$ R; z' v& Q, g" Z, ]不做内循环 200s
    " q. s$ K, D# b8 d; ~6 l; a9 _8 B* V4 t) s# ^/ b+ A. R6 i
    你昨天说的对,内循环本身占比是很小的,大头在其他处理。
    7 y' D5 o: G% M9 n6 M, K* \另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
    7 Z- D0 U# _+ l  e! N, ]4 O" E; h3 m' S! g2 J
    至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)5 e) t, j7 y/ E3 Y5 o* g
    + g% {) E& o5 B
    (为什么下面我贴的  b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成  jj 好了,原来 方括号里的 i 是斜体标志  LOL)1 L+ q* B. a8 K3 \9 l

    ' S  d# H' E4 r
            std::vector < float > vec1(N);
    % `' C8 p6 \/ c0 @  K        std::vector < float > vec2(N);$ t- s" N9 M% W$ G8 h
            float* b1 = new float[N];
    # S7 {# d- N5 D  ?' }. g        float* b2 = new float[N];
    / t! p& {0 _; y6 L  @. l9 y- K. ~
    9 H8 ~$ K7 o3 M- c        for (int j = 0; j < 6000; j++)
    $ Y' n% B/ L& m- z) ]" j        {
    9 F! m# O5 g& K3 H- D                std::generate(vec1.begin(), vec1.end(), []() {$ N, `+ r- ]8 k/ M% V4 `5 E
                            return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;+ v; r, z- h  t2 L$ y
                            });  q+ Q' j' u6 j) S% x

    ' e! T) C8 c4 ?, L4 i2 C2 n+ j                std::generate(vec2.begin(), vec2.end(), []() {
    ' }7 Q; u, `: m  e5 d                        return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
      o9 c$ T! {6 i, y. v' E: s                        });5 i) t0 @9 U; l# t

    & F0 x( }6 f1 f- g: e3 C                for (size_t jj = 0; jj < vec1.size(); jj++)
    , d, f  z8 C7 _4 }, b                {( l7 B4 _7 L' V' U6 \- j
                            b1[jj] = vec1[jj];
    1 y% f! h/ ~3 `( F                }
    3 |' j& O3 L) i( z/ S7 j/ m  P, r
                    for (size_t jj = 0; jj < vec2.size(); jj++)
    # `% M8 h' [4 `2 F" ^                {2 u8 S0 K0 @, w1 B0 n4 X; ?
                            b2[jj] = vec2[jj];
    5 W: W/ R4 d3 Q3 N  P2 d                }
    ( e9 B, b, Q, V2 ]" U
    . j- v/ a# T. V0 Y8 f5 {  t                //Method - 1  N=100000 247s  
    - f$ Z: |' V. P5 a0 B9 p- e( T                //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
    ; q7 r* ?+ R  A$ A, V                                / q9 [) i7 ?4 I+ D) Z
                    //Method - 2  N=100000  237s
    : v9 ]2 E) s1 M                /*
    ' N9 F/ O5 r( B+ E2 C  x) C                for (int jj = 0; jj < N ; jj++)% L8 [% \9 p% h) H4 s
                    {
    # W. L3 {" p" k- I8 r) ^                        fresult += vec1[jj] * vec2[jj];2 }' e4 W. b# Z9 @( p1 C- I# t
                    }8 V5 d7 B1 E1 X2 A
                    */
    6 x/ N: u7 i" Z                                5 D. O: E1 f1 p
                    //Method - 3  N=100000 204s
    . z: W+ O. y; {! u$ ?: i/ n* v                /*9 B# o% C8 n2 z: K
                    for (int jj = 0; jj < N; jj++)
    # \, U$ V4 V6 f+ `  T' z- a& d                {
    3 M0 i3 }$ F6 ?, w6 D                        fresult += b1[jj] * b2[jj];$ V; O# r3 J+ p9 L" c
                    }
    $ ]2 k8 `  q5 ?- Y! d                */
    $ N/ y# h8 B1 n9 u8 d" v' _% L" c" H( }
                    //Method - 4   202s
    ' i/ }  p9 M% e  w                /*
    # Y  D4 ~9 C* n# A9 f& C                for (int jj = 0; jj < N; jj++)
    ' R# C0 N# A- C  A5 V                {
    ' w) ^2 T8 y1 T; D, u. }- ?                        7 A" G7 R( y$ H: P0 g4 W3 g0 C
                    }
    - g4 T! h, A( S7 `                */7 z+ U9 e" d$ R$ M0 J6 a2 o6 M
                    //comment out all methods, N=100000  202s                2 e, {# S2 D4 g9 s6 n
            }
    9 C$ A4 Z  `  _3 n2 I1 \# b, |3 L6 m% b/ ?- R5 R
            delete []b1;- l5 B1 r2 m( F& G. _& r" ]8 T
            delete []b2;
    " A& [4 O+ ]. T" J+ R$ f- {% c
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    16#
    发表于 2022-9-27 00:15:38 | 只看该作者
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?6 W, X3 t0 r( t7 s1 L# F

    1 R) k: @0 S% ]5 M9 O. B1 {你第二个试验里面的j在循环里面又重新定义了啊,你确定真的跑了6000次?9 w  E, B# @5 |5 y. @7 A2 `
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    17#
     楼主| 发表于 2022-9-27 01:16:03 | 只看该作者
    机器猫 发表于 2022-9-27 00:15
    ( q0 ~) h& y" b# L6 M; g瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?
    ; f! J- W2 {, J
    . t; e! c9 o2 ?# R1 f6 X& @你第二个试验里面的j在循环里面又重新定义 ...

    4 N, @$ Y) m2 R4 \: J) i! J5 t内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL
    ; |7 }# l: B4 K1 z4 a
    & v$ f4 y, z# V+ C+ _不和它较劲了,瞎耽误工夫,我已经转到 ubuntu, 也准备顺便试试 avx2 向量化。
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    18#
    发表于 2022-9-27 02:06:58 | 只看该作者
    雷达 发表于 2022-9-27 01:16
    . J; H8 F9 S- \/ j内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL
    5 E" h+ b1 R: k8 h! e: M
    - \& [0 I% M# X# M/ T; \$ `, u( \不和它 ...
    7 l8 A- p' f$ g/ ~7 \$ s

    - @# }+ [) B9 a/ A- ~1 d# e) ^不过可以试试我说的register变量。前一个试验j是混在一堆其它变量里一起定义的,很有可能是在stack上,这样内存读写会更多,要是再碰上每次都需要加载cache就更慢了。
    : z8 N2 m( \5 k! ^; ^- I# V后面一个是在循环那里定义的,说不定编译器就把它优化成register变量了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

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

    使用道具 举报

    该用户从未签到

    20#
    发表于 2022-9-27 20:29:50 | 只看该作者
    雷达 发表于 2022-9-24 23:54
    : c$ n0 W3 d, X: Yvoid xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)7 k' p) q4 V$ R/ B7 p9 _
    {
    6 J  X$ U4 f( @9 M, j# C7 V        comp temp, xtimesy;
    / V" W' |- o9 @/ e+ P
    这个code里面如果Openmp没有被注释掉的话,那么temp那个变量应该是定义在循环里面,否则线程之间会存在争夺写入那个temp的风险。
    ( T: }1 Y, |. y  Z) H6 ?" S9 x# @内层for循环如果没有内部操作的话,编译时应该被优化掉了,和你完全注册掉整个循环是一回事。可能你的编译设置没有打开优化?" |5 U6 p/ d; l0 l
    VS社区版没有问题,我工作用的就是社区版,设置正常的话不会比商业版差。以前游说头头用Intel Compiler,他说不想花钱,而且差不了多少,就一直用到现在。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2026-8-12 12:35 , Processed in 0.078981 second(s), 19 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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