设为首页收藏本站

爱吱声

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

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2022-9-24 22:54:26 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
    C++ 比 Octave 慢好多,怎么破?
    - t, ~! g8 o9 C6 K- l& u
    ; s) |1 ^9 P; [+ j自相关两层循环,内层循环涉及浮点数计算,试验了一下把内层循环内部全都 comment out 只留个壳子,  但空的内层循环本身就把速度拉下来了,看来问题并不在浮点计算。
    4 A, w" i- ]4 M; l
    # }  m6 w! ?9 G速度优化问题真的很有意思啊。
      R8 p$ `3 @" k5 T- I# p4 Q
    % @) _0 Y) H3 A) n. v9 R- v欢迎大家继续讨论

    评分

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

    查看全部评分

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

    [LV.Master]无

    沙发
    发表于 2022-9-24 23:04:16 | 只看该作者
    拉下来?拉多少?9 j$ K. l& m9 r0 T  A" ?6 T/ J5 y5 J7 [0 |; }
    把代码贴上来看看?
    2 |$ `7 D3 V! @* v# Y5 `! @* Z0 w6 ]6 c- {# r. P
    难道分支预测不准破坏流水线执行?不该啊。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    板凳
    发表于 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 编辑
    4 O8 n" F7 K5 J$ H0 b2 f" g
    数值分析 发表于 2022-9-24 23:04
    8 E9 i! o% O$ Q" M/ S2 V" Q& F+ K拉下来?拉多少?
    + l$ L6 {) L; N. {6 r0 s把代码贴上来看看?

    + f; O$ s4 E+ Z8 X, g8 t; N) l/ A! R6 R7 N
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)4 V( Z# V( [& |6 U% ?7 q8 @. O
    {
    % f& f$ b  Q3 I5 D: m        comp temp, xtimesy;3 I$ u# o1 w; Q) P& e+ ]( F
            xtimesy.re = 0;
    . ?, L" _1 X! V5 z: w2 T* D. ^        xtimesy.im = 0;
    # v  Z: Q% Q' ?$ p4 O        int j0 = lenB - 1;
      v& p/ S4 X" O5 h, y% ^        int    i, j, i1, reali;
    , f2 _* S# M7 T- a- P        if (lenA % 2 == 1)
    , s, k% G# h& u                reali = lenA + 1;0 V$ \  H6 d. b- |$ b: a
            else4 m) h* \$ W6 |2 M& ^
                    reali = lenA;
    . M. w# ]9 W2 c/ t9 u$ N        reali /= 2;  |8 x1 X+ x* f4 x; \- C
    / i( Q  V# d/ J* j
            int nconv = reali + lenB;( g% X4 o& l: B7 Z7 L+ j6 h# n! e
            //#pragma omp parallel for
    5 c. E/ P  \) H+ d% f        for (i = reali; i < nconv; i++)
    / |6 D4 A0 T/ R. e        {
    9 _6 U/ ]  M# @. v3 [) k  N                temp.re = 0;
    % ~; G% d" q. D0 \4 a! O4 V                temp.im = 0;$ b  m/ J8 S. l/ K- F4 j
                    i1 = i;
    - @6 g/ m4 N8 `4 N1 b* d                for (j = j0; j >= 0; j--), w9 N) K! E) e- K8 k, x
                    {3 a& d& m5 f6 q, M, {  J
                            /* floating date operation */
    ; N( ]  q: `7 Q" H                }

    ; R) `' R+ X( x4 z8 T8 d        }5 R0 d) }/ Q! O! G. N, Q
    }
    * Q, I0 ~9 L* U4 Z" k8 s9 r4 d( M9 Y6 W& I3 T" M5 r
    xcorr函数代码如上,comp是复数struct, 做过长度为11、19两个矢量的测试,和octave结果完全一样! E& b& D6 g8 t0 d
    4 Z0 I5 Q  |+ N; J4 W
    红色部分是内循环,现在其内部操作都comment out 了, j0大概是 6000。  y9 |1 B: o+ l6 C1 L  Q0 o' H, B  i
    现在call xcorr 100次,耗时78s.
    ; S; \7 [5 {9 e0 C$ a3 G/ I+ q, t0 G  ^
    如果把红色部分内循环本身完全comment out, call xcorr 1000次,耗时 <1s.
    9 U+ r# _$ X, y$ {* Y2 T% }4 W% U' a( d' A  `' ~5 \: @7 _) i' Q
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    6#
     楼主| 发表于 2022-9-25 00:17:17 | 只看该作者
    风雨无阻 发表于 2022-9-24 23:33' W# C* W( h( P4 l/ e9 F8 |$ {! C
    Maybe Debug mode?
    . G' ?0 R* F* E1 f! z1 @

    , c0 T& q1 l& G2 r  R% t2 E& P3 V; n不应该,看我上面的回复。
    9 U1 y8 U' R  b6 W' C% d
    ( F9 {6 G0 `& o4 A9 B) N" f4 q* ^我更怀疑是 VS 社区版的问题
    回复 支持 反对

    使用道具 举报

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

    [LV.Master]无

    7#
    发表于 2022-9-25 00:20:10 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 00:24 编辑 8 ~. e8 f9 @9 y, Y; N2 \) X2 `6 x
    雷达 发表于 2022-9-24 23:54
    ) P: ~( l0 F. \' K7 cvoid xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)0 d$ u9 Z4 [3 I; F7 Q: @
    {, l+ S: p% f9 N2 F
            comp temp, xtimesy;

    6 f; A# L1 d) @3 U2 k
    & n4 N" s7 H  f" p# E5 Y2 Y这个不是这么比的吧。。。" C2 G* r' x) x/ y0 q

    . N1 E6 K2 D+ e* K" Y您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    . k% j+ v1 P8 M" Z) H- N* Q5 Z# D7 \7 d, f& U( n- w
    而加上内循环,光jmp和dec指令就至少多执行了6000个,慢个几十倍不是正常的么?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    8#
     楼主| 发表于 2022-9-25 00:46:56 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 01:09 编辑
    ; {1 m$ K* E1 X2 N% i
    数值分析 发表于 2022-9-25 00:20. W# E" a+ v1 m
    这个不是这么比的吧。。。
    * |6 b$ B" o0 o$ u
    2 h6 `1 Y  P. u' G! Z7 E2 S( g您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
      g) W1 C) `( i- D4 _

    ) Z, X* \! u% E( r/ V$ M0 D2 x有道理。* K- f  H; r4 Q# m) Z
    所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,记得 numeric 库里有算向量内积的,我回头试试。
    + W/ b% a7 p% m$ V
    ; d. M1 Z7 d. m# ~2 u我先尝试尽量用标准库,一个小程序,不想搞得太复杂。多谢了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    9#
    发表于 2022-9-25 01:27:53 | 只看该作者
    雷达 发表于 2022-9-25 00:46
    " S* |$ f& J8 X& r! s) q" Q有道理。
    - F1 c/ `! l- y' x+ f' T7 P0 i所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,这大 ...

    - ~6 e5 E: s7 b4 D+ r你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子,把循环本身翻译成机器指令loop或dec/jnz,两者速度上会差很多
    ! K: d, T8 b  i7 cWhy is the loop instruction slow? Couldn't Intel have implemented it efficiently?
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    10#
    发表于 2022-9-25 01:48:51 | 只看该作者
    数值分析 发表于 2022-9-25 00:201 E- P0 x. ]* x) x4 _$ z" }7 C
    这个不是这么比的吧。。。0 w7 {" A1 Y; t) z+ o

    1 p; c% V7 b% @' j" k4 K0 h您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    而加上内循环,光jmp和dec指令就至少多执行了6000个

    - ~% l0 Q- L$ g
    8 G- c: h. z6 Z! ?现在的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 编辑 ; @9 x" P: o; `  a9 O0 Z& r' s- s) D
    沉宝 发表于 2022-9-25 01:48
    8 J* r" r9 Z1 X9 {/ j* m- D* k现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果 ...

    1 J) }6 Y$ {3 e2 O) E; _; l4 [2 A% A" G2 J# K/ E
    是的,兄台说的对。
    2 J+ P9 l$ v2 O( j9 o8 `( m7 n" R/ U- [
    其实我想说的是 真正数值计算部分和代码中其他不直接计算的overhead的比值这个事儿。' v* Y: M( H: E9 I4 F. O5 }* }' l

    # F! |6 B1 @2 Q4 a: I4 H雷达兄构造测试用例的时候,屏蔽掉了所有计算的部分,使得剩下的都是overhead,这样run time比较的结果就显得好像不合理了。如果把计算加回去,计算部分的run time会dominate,结果就不那么离谱了。因为不好说,所以用指令数对比的方式试图直观地说明这一点。
    9 p. _  O( Y5 r& I! q
    7 Z8 B) D8 Y" `" }/ f比如说,如果有计算,那么跑六千个循环相对于计算应该用不了多少时间。但是如果一边是什么都不做,另一边是六千个循环,那六千个循环比什么都不做慢几十倍了,就不是那么不合理了。; `8 t. b5 `) d. Z, K1 I
    3 I( u6 ~! M$ q5 K+ b, [* U
    当然也有可能像兄台说的,是优化参数的问题,但我觉得更多地是测试用例设计的不合理。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    12#
     楼主| 发表于 2022-9-25 04:47:43 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 04:49 编辑
    2 Y; Q2 w0 B9 ]
    沉宝 发表于 2022-9-25 01:27
    ; D9 [. [) u( Z& ]你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子 ...
    : y4 c3 z4 n8 ~1 I: K7 M0 Y
    6 z6 N/ V/ f  |! |  {
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差一倍,我上面这个差的太多了。/ |9 C/ y+ c' X* o# J7 y

    9 j! u, D  Z" t$ E, H我已经完全懵了。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    13#
    发表于 2022-9-25 05:51:23 | 只看该作者
    雷达 发表于 2022-9-25 04:47
    4 X2 ^6 m2 z8 A9 t; K又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...

    $ ]& ]# m4 s( n& c$ b# o时间差一倍的结果可以接受。
    5 y1 O! y. b* s- Q0 F% p9 L: Q  t" q9 c) a- B2 p" Y
    你还是用profile工具看看吧。现在大家都主观瞎猜。
    回复 支持 反对

    使用道具 举报

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

    [LV.Master]无

    14#
    发表于 2022-9-25 14:58:59 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 15:38 编辑
    7 |3 R. T+ x. @* j! S6 c! Q. l
    雷达 发表于 2022-9-25 04:47& F. E6 F8 u- u; p* C4 w$ [' [2 b
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...
    & u# ^- j& i4 b0 f

      b3 E% b+ Z# \% k
    3 {. Z& z" u, K4 L' u2 I, }, S7 J+ X- ^1 o2 Q
    能不能把这个也贴上来,看看和上一个有什么不同?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    15#
     楼主| 发表于 2022-9-26 01:30:03 | 只看该作者
    本帖最后由 雷达 于 2022-9-27 01:17 编辑 ; @2 `$ [1 Y! P& j5 P$ @6 [
    数值分析 发表于 2022-9-25 14:58
    , m( h6 K8 M3 s' E- K9 y3 r& M+ e能不能把这个也贴上来,看看和上一个有什么不同?

    ; d) B* n7 |+ d理了理思路,重新做了一个测试。; B, s  Q" B: T
    做了两个 vector 和 两个 float *, 都长 100000$ `) n0 }$ `1 l% z
    外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.: j2 A% x! y# J$ e
    % e3 o& e8 s' K0 Y# H6 i0 D
    内循环试了4种方法,( Y2 Y$ X) H2 u) o, k0 _$ k
    1. 直接调用 vector inner_product 247s
    + |' Z1 G* K2 X4 [# R5 V2. vector 循环点乘累加 237s5 I6 j( {% s, F" j0 B/ K1 u# k
    3. float * 循环点乘累加 204s( U! F1 y- z+ F9 n! x& W1 W6 y' r
    4. 空循环 100000 次 202s  F6 l& J' ~& v% S/ [  n3 g" p5 V  C7 n
      K& \9 J8 [* `$ Z! [+ p
    不做内循环 200s
    ! v; c. R3 C8 {7 P) m
    : t5 }- {! z( D2 \7 H6 D9 I你昨天说的对,内循环本身占比是很小的,大头在其他处理。
      F3 n* z# E& {" t/ H另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。$ f8 |8 z5 J$ X, `9 _" Y/ F

    5 e1 W; R8 q$ d* L/ l  d  k至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
    * l) l0 x; w! Y/ n
    # L0 |8 N2 ^8 r3 M/ \/ O(为什么下面我贴的  b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成  jj 好了,原来 方括号里的 i 是斜体标志  LOL), L' ~; K: C! C+ W# I" P
    2 n5 m+ G$ {* j& V  m, w
            std::vector < float > vec1(N);
    , \# A( s! g9 l7 {; C- T        std::vector < float > vec2(N);( ]5 b6 x6 P% H
            float* b1 = new float[N];
    % ?3 Y" q' }6 f! _" \6 t        float* b2 = new float[N];
    5 H- d) j; I, J' W0 G% ^3 c, ?. B! y" T5 i# i* v
            for (int j = 0; j < 6000; j++)
    , D0 V7 Y7 ^- A8 b( J8 f/ z- {        {
    2 A( @1 a) l7 W6 l; h                std::generate(vec1.begin(), vec1.end(), []() {! h; M' j1 B; n1 O& u
                            return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;. ]: w5 c. b2 x8 x. ^# q" p; F
                            });
    # x. S* y) x. Z: D3 ?( ~2 A2 X& T& A0 h0 B# l7 Q
                    std::generate(vec2.begin(), vec2.end(), []() {
    9 g& E6 o8 ^) ~# j3 I/ [                        return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;$ O* d/ d! B0 E5 D0 u  Q* \5 y; z
                            });
    1 M! x+ ]9 m8 k; F2 b9 q1 w) |! d1 J+ Z6 b  M0 v' i
                    for (size_t jj = 0; jj < vec1.size(); jj++)  h" v  r' \0 X) R8 H  x
                    {" j) u$ g: {4 c! N0 G- f% C4 y
                            b1[jj] = vec1[jj];
    ; F9 c5 P# R! j& K' J! i                }
    " d6 i# S7 l/ y4 T6 A
    0 g2 N6 M( O" T& @7 J                for (size_t jj = 0; jj < vec2.size(); jj++)' o; e/ S' c% L$ Q, l! O- q
                    {1 p5 w, |6 n1 s8 M. k  L1 c
                            b2[jj] = vec2[jj];  u& `" x4 O9 V# b4 f
                    }
    ! w% Q4 E, }0 Y0 @, A5 b) v
    0 C  ]  ]( ?, b- }3 u/ z                //Method - 1  N=100000 247s  ( l. `0 ~0 X2 Q
                    //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);& R9 u* ?6 y1 A$ H* @+ ^5 K& c
                                    
    4 f4 J$ |8 W6 Q, A                //Method - 2  N=100000  237s
    4 g4 w8 U. l( M; t8 T& K                /*
    5 Y( i; T8 x. t% M, n, d                for (int jj = 0; jj < N ; jj++)3 `+ F7 d; J& p5 O
                    {
    . [0 [  Z& y$ S7 \  h/ H                        fresult += vec1[jj] * vec2[jj];) B1 W6 |: i' a$ V- L, A
                    }
    ' ~% E: ^4 G' g: v# ]; N6 `                */0 x; _; \( @5 b4 C! s
                                    
    8 A9 H8 G: ?; L7 @  ^4 S4 T) P3 S8 D                //Method - 3  N=100000 204s
    & O# @, X8 v  |" w  i4 ?1 @; c                /*( Z, R+ M6 \( O/ g7 P4 m; U, @: U
                    for (int jj = 0; jj < N; jj++)
    ; |) e# U" }& h# N; l, D& H                {! z- R$ d# d7 {2 _; J' ]$ j5 p2 j
                            fresult += b1[jj] * b2[jj];7 y' V. x* }5 T! j; g
                    }
    % o; ]' g8 R8 ~7 h# D* g* k5 S                */
    - M" {" r  J; ~  A4 ?9 x) }7 M" ~0 V* V- B: U+ q
                    //Method - 4   202s" c' D5 ]& f' }$ }# |$ Q) `4 Y
                    /*1 B2 S' |5 A. \& b( Z
                    for (int jj = 0; jj < N; jj++)0 ^  i0 v" P0 q! N0 j
                    {
    3 g! L% @& v: S( n, @2 @                        
    8 t4 U  h- u4 ~) j: s! Z                }* q$ k& d6 k4 _  F& T/ {
                    */
    - Z2 r. V% s1 n, }' k                //comment out all methods, N=100000  202s                & w( S/ G5 v6 R' ?8 U- N  X
            }/ N! ^5 G* G# z, c7 `# M

    0 q( l  n5 t& Y7 k        delete []b1;4 j- V5 z: E1 m& g, w; P
            delete []b2;

    * h3 o& V. h+ I1 S* i
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    16#
    发表于 2022-9-27 00:15:38 | 只看该作者
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?
      u2 G2 }7 |! p# x# Q; g0 F2 T5 x
    9 i' N+ O+ f& ?你第二个试验里面的j在循环里面又重新定义了啊,你确定真的跑了6000次?
    & c! i" U+ X/ n, |9 L7 |( t
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    17#
     楼主| 发表于 2022-9-27 01:16:03 | 只看该作者
    机器猫 发表于 2022-9-27 00:15
    / n; F) ]' ~, v* W; ]瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?
    ( H. F) h4 ^$ Q6 F# W8 d$ W0 @
    + [+ S/ q, \9 \+ z7 e你第二个试验里面的j在循环里面又重新定义 ...
    ! X7 T3 o8 s  g7 _% K
    内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL
    % G: f6 U! r2 P/ }9 |/ A
      c4 [0 N% \0 e/ a' O) M, }: u& ^- K不和它较劲了,瞎耽误工夫,我已经转到 ubuntu, 也准备顺便试试 avx2 向量化。
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    18#
    发表于 2022-9-27 02:06:58 | 只看该作者
    雷达 发表于 2022-9-27 01:16
    % L+ E  P* ~, |内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL/ Q2 }- P* g  F& C
    8 f8 J5 R* k: I9 Q  o
    不和它 ...
    - C0 J+ J3 I$ @' G0 P3 q5 |

    + n( W( [& U- q不过可以试试我说的register变量。前一个试验j是混在一堆其它变量里一起定义的,很有可能是在stack上,这样内存读写会更多,要是再碰上每次都需要加载cache就更慢了。
    ! i4 F; @0 X+ h* d7 t后面一个是在循环那里定义的,说不定编译器就把它优化成register变量了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

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

    使用道具 举报

    该用户从未签到

    20#
    发表于 2022-9-27 20:29:50 | 只看该作者
    雷达 发表于 2022-9-24 23:54
    0 o- y9 w5 L2 x6 P7 Lvoid xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB); G' B( N+ T" S. R. H. E1 h
    {1 m4 H+ l. F( o- ?
            comp temp, xtimesy;

    1 H% a! E2 r9 F这个code里面如果Openmp没有被注释掉的话,那么temp那个变量应该是定义在循环里面,否则线程之间会存在争夺写入那个temp的风险。
    9 z# }+ k! Z  F& m% N内层for循环如果没有内部操作的话,编译时应该被优化掉了,和你完全注册掉整个循环是一回事。可能你的编译设置没有打开优化?
    ( d) {% b- P( ?1 n, Z2 pVS社区版没有问题,我工作用的就是社区版,设置正常的话不会比商业版差。以前游说头头用Intel Compiler,他说不想花钱,而且差不了多少,就一直用到现在。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2026-6-2 02:51 , Processed in 0.067071 second(s), 19 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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