设为首页收藏本站

爱吱声

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

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2022-9-24 22:54:26 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
    C++ 比 Octave 慢好多,怎么破?
    / J# `  V( q0 U+ g; n8 |4 P' t4 \
    1 ?2 K' e% ~7 T4 y& L自相关两层循环,内层循环涉及浮点数计算,试验了一下把内层循环内部全都 comment out 只留个壳子,  但空的内层循环本身就把速度拉下来了,看来问题并不在浮点计算。
    1 U/ ^5 l4 J/ |( k0 W+ z
    7 ^% ]7 j" I7 {. |速度优化问题真的很有意思啊。5 o/ t' w  {! V$ v0 m
    * i$ n4 w# \( ]4 K
    欢迎大家继续讨论

    评分

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

    查看全部评分

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

    [LV.Master]无

    沙发
    发表于 2022-9-24 23:04:16 | 只看该作者
    拉下来?拉多少?
    * ~$ Y/ A/ ~6 p! j& Y  E- R1 @6 b把代码贴上来看看?
    : \& s6 B" S4 J9 n  }1 D/ E
    + g+ T5 O. n3 U7 R# z2 s- G难道分支预测不准破坏流水线执行?不该啊。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    板凳
    发表于 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 编辑
    ) Q. t+ s' E. e+ s% U" A  c& G
    数值分析 发表于 2022-9-24 23:041 R: y& X. R, S
    拉下来?拉多少?+ \" b6 |1 i/ E* E+ ?
    把代码贴上来看看?

    $ ]$ [6 u; {! p+ Z$ h
    . n0 y: a( z$ p7 j/ q; [void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)1 Y9 J, D# {# Q! M
    {
    ; D6 ~& f: N7 O        comp temp, xtimesy;
    ( o& V/ \. a' u$ b' p        xtimesy.re = 0;
    1 D# Y3 K! n# e) D* F+ w) i! b: {        xtimesy.im = 0;
    9 g6 f  M) L! K3 ~; W/ D( e' b1 i        int j0 = lenB - 1;
    7 g8 y* s, S9 h, z. s( E6 j        int    i, j, i1, reali;
    & D  A3 L8 X3 X1 k; R% F. K        if (lenA % 2 == 1)4 C5 V. D' u. s+ C1 f
                    reali = lenA + 1;
    + C( T3 A. }3 N4 x8 x( j, n. |! ~        else0 j2 G, D6 O& Q1 I  _) b) c( {
                    reali = lenA;
    ! p, j6 ~% Q2 m: m6 |        reali /= 2;3 ]: D( d( K! \1 l5 F( D2 N2 }
    " T% ]+ Z) W, i$ c8 ]" s' A) X3 ]
            int nconv = reali + lenB;
    0 D: g  L: n2 J0 d5 m        //#pragma omp parallel for! Q& X8 v8 ^! X# U
            for (i = reali; i < nconv; i++)
    . V" a: G& {) p/ s- q; u        {! d: l4 M% G5 c, h" B3 K
                    temp.re = 0;
    6 K; N+ F  W8 Z  [( l  `                temp.im = 0;
    ( h  `* }' b# O) R( ?& J                i1 = i;0 r/ @: X0 O, O+ x) E+ U
                    for (j = j0; j >= 0; j--)
    4 ~3 q* L+ H; t) G/ _. Z                {
    7 C+ k  _! k) n                        /* floating date operation */% L6 Q$ [5 ]5 b' r) ?& L
                    }

    ) j( C& G+ b. |5 f* o! i1 K- Z        }
    3 R8 W* }7 l/ E% }8 o2 @}
    ; m3 k3 c/ V9 D* |' F0 o1 l) K$ a9 _6 O- {' L! G
    xcorr函数代码如上,comp是复数struct, 做过长度为11、19两个矢量的测试,和octave结果完全一样
    / C& P4 `+ P5 h2 V
    1 ^& B& m/ i* B% S5 z红色部分是内循环,现在其内部操作都comment out 了, j0大概是 6000。, n+ a2 l" L' d( M# x
    现在call xcorr 100次,耗时78s.
    / S; _/ ?" h  _* x( [" s/ D  {! q, E% H8 R2 V
    如果把红色部分内循环本身完全comment out, call xcorr 1000次,耗时 <1s.
    , u+ D( a+ y5 l- o/ R; [  g4 r( H0 y1 R
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    6#
     楼主| 发表于 2022-9-25 00:17:17 | 只看该作者
    风雨无阻 发表于 2022-9-24 23:339 [" l8 P  W0 O( S0 h
    Maybe Debug mode?
    ) K3 ]1 w0 E; B3 Q$ w) D

    4 d2 t4 N4 ^& N) D+ ?' L  Z不应该,看我上面的回复。$ P5 h$ f8 f; }
    . O, b% e  x% y' p. a8 y) a: B" E% C
    我更怀疑是 VS 社区版的问题
    回复 支持 反对

    使用道具 举报

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

    [LV.Master]无

    7#
    发表于 2022-9-25 00:20:10 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 00:24 编辑
    3 S2 G$ b4 n+ T  W9 s1 o
    雷达 发表于 2022-9-24 23:54
    8 m& T2 h5 |+ pvoid xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)' E  [- M( s4 W) J. E, z
    {# h% f. g  ^% B( y6 N
            comp temp, xtimesy;

    ' X& @. D! p: k, Z- U
    . x; L' u# |3 W/ u这个不是这么比的吧。。。& @6 y! W6 _: Z, U& f" e
    7 R6 \0 ^( ^$ D, {
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    $ F4 l1 P- V/ s/ p( q% R
    7 @& ?1 A2 ?, Q: z  d而加上内循环,光jmp和dec指令就至少多执行了6000个,慢个几十倍不是正常的么?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    8#
     楼主| 发表于 2022-9-25 00:46:56 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 01:09 编辑 9 Y& o1 b0 o2 e$ k$ {
    数值分析 发表于 2022-9-25 00:20
    , A) p+ k) U, J7 M7 D4 W3 k; U这个不是这么比的吧。。。# R3 X- I$ d6 b0 P/ T  o% j( m. A1 `
    . C  u; v& l& }4 a5 j( O* d
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    - m2 M7 `  s4 A5 v9 G- [  [) p5 @
    2 c  C( P2 J1 `6 W
    有道理。
    * w- Q- u1 |* n( Y+ n所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,记得 numeric 库里有算向量内积的,我回头试试。/ ^1 A  `$ T* A9 N. ]3 r

    ' V  Q, `- o9 c" y/ U我先尝试尽量用标准库,一个小程序,不想搞得太复杂。多谢了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    9#
    发表于 2022-9-25 01:27:53 | 只看该作者
    雷达 发表于 2022-9-25 00:46
    9 A4 `1 W! Z& S7 H; O& H有道理。
    ' o( {  b$ O# a. n/ @所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,这大 ...
    8 k* u% Y5 }# b5 I) j) f( p
    你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子,把循环本身翻译成机器指令loop或dec/jnz,两者速度上会差很多) ^( H; a1 a0 b! L, _! X
    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
    # h' j! s' c$ r, T: u/ }- h) o这个不是这么比的吧。。。- I: s% Q' c8 S0 @' g  o: d

    ) g8 E# J  N2 f2 k2 t您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    而加上内循环,光jmp和dec指令就至少多执行了6000个
    9 m" [3 T7 Q6 T

    # i) {3 S  y5 l* q现在的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 编辑
    ) v; }7 s4 g7 H& D+ D, c. {* P; V
    沉宝 发表于 2022-9-25 01:48, G5 o5 F- G1 ?
    现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果 ...

    " i) I; F$ l1 [. o8 e
    9 z& T9 \$ p- S8 g是的,兄台说的对。
    1 a# ]  \; V4 k  Y" O; J0 E  `% c5 V0 A$ e+ k" z; q5 H$ T
    其实我想说的是 真正数值计算部分和代码中其他不直接计算的overhead的比值这个事儿。; z+ D8 e; Q3 _; v+ D: ?
    . E# B% L) c- N, D( }3 h6 U; i  E4 s
    雷达兄构造测试用例的时候,屏蔽掉了所有计算的部分,使得剩下的都是overhead,这样run time比较的结果就显得好像不合理了。如果把计算加回去,计算部分的run time会dominate,结果就不那么离谱了。因为不好说,所以用指令数对比的方式试图直观地说明这一点。
    ' I2 @" M" B" h# Q) R5 g+ B8 d- t3 x2 @/ S& F1 S
    比如说,如果有计算,那么跑六千个循环相对于计算应该用不了多少时间。但是如果一边是什么都不做,另一边是六千个循环,那六千个循环比什么都不做慢几十倍了,就不是那么不合理了。
    " v6 M( q3 v: K) }1 P  k# ~/ m3 U+ H! |) G0 e3 F: q5 I% }
    当然也有可能像兄台说的,是优化参数的问题,但我觉得更多地是测试用例设计的不合理。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    12#
     楼主| 发表于 2022-9-25 04:47:43 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 04:49 编辑
    ' ~' _( a9 V4 A1 j% [1 z6 x2 [9 q0 Q* P
    沉宝 发表于 2022-9-25 01:278 _1 `, x: G# {4 |9 i4 O
    你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子 ...
    # ]# e( T  Q. n" K" d! e2 Z% z

    1 f0 R& j  X. n) H$ S又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差一倍,我上面这个差的太多了。3 r" ?+ h( U6 P( v( ]" V7 c
    . K; V3 X7 d( ~3 ]+ _3 m0 U
    我已经完全懵了。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    13#
    发表于 2022-9-25 05:51:23 | 只看该作者
    雷达 发表于 2022-9-25 04:472 _. \9 c& L! O7 O& J2 H
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...

    , N3 m( d! p" b) ]) o4 T: `时间差一倍的结果可以接受。2 }8 @6 `( p" ?$ A) R! t$ M( b
    4 U4 Z7 Y1 e3 j: Y4 ^+ Z
    你还是用profile工具看看吧。现在大家都主观瞎猜。
    回复 支持 反对

    使用道具 举报

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

    [LV.Master]无

    14#
    发表于 2022-9-25 14:58:59 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 15:38 编辑
    2 a2 Q0 e! N( E$ }& `$ Q
    雷达 发表于 2022-9-25 04:47
    " W/ R* c5 k2 ]又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...

    % w! h* A2 j; l6 ~
    " J9 ?" |& V* m! S, _9 J
    5 K$ C  }8 J( \4 M
      j! Z, N4 e7 J5 ]5 g0 [能不能把这个也贴上来,看看和上一个有什么不同?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    15#
     楼主| 发表于 2022-9-26 01:30:03 | 只看该作者
    本帖最后由 雷达 于 2022-9-27 01:17 编辑
    * ]0 u7 X% x( ^1 O: ?5 n# P
    数值分析 发表于 2022-9-25 14:588 h% D& |0 u1 x, W5 l$ m! F5 F
    能不能把这个也贴上来,看看和上一个有什么不同?
    + F; |9 P- X" a
    理了理思路,重新做了一个测试。
    . G) R: S& V6 H2 M* e) H' O做了两个 vector 和 两个 float *, 都长 100000
    ( {% \# Z% ~' S' t; k: {+ @( A  j外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.0 q, I% S' ~+ a' t- g9 s1 J
    $ {% o/ P9 }, f& x' G4 U1 ]# z( t
    内循环试了4种方法," t/ R- ?2 _0 S# T1 p6 |# ?& a
    1. 直接调用 vector inner_product 247s 9 C7 G! k# D" i
    2. vector 循环点乘累加 237s( t2 c& N  E6 N' t$ a8 j& N  @
    3. float * 循环点乘累加 204s: ^' q* L; s0 r6 K  q
    4. 空循环 100000 次 202s
    ) l4 }' M' k  U, p2 D
    $ _$ C* B' I/ ^3 n+ a不做内循环 200s; d4 d4 k; `8 D: s# W6 l  F

    : q/ R0 n6 V  E* }' [; S你昨天说的对,内循环本身占比是很小的,大头在其他处理。& a+ m- f7 }% ]: P1 V& R( E' l
    另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。2 Z% F& D" K# ?, j: o2 I/ E  k( c

    # w* E: k) ^" v6 h5 v. c  G1 L至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)% @3 ?# G1 G( [# j. o" B# M
    + n, u7 H* G5 o  W- k4 o' g% O
    (为什么下面我贴的  b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成  jj 好了,原来 方括号里的 i 是斜体标志  LOL)
    " J! F1 w! z+ B! e9 r+ o  e1 n& J) J2 F$ U5 y
            std::vector < float > vec1(N);8 Q. K. p$ q! @, Q6 E2 y
            std::vector < float > vec2(N);
    * _1 e' n1 U/ C' {        float* b1 = new float[N];, I; r; k- @7 L: h" F
            float* b2 = new float[N];
    - g8 U% W+ ~  K; y$ x9 ]6 K* K8 k, E6 E3 k; |! l& w
            for (int j = 0; j < 6000; j++)
    6 x6 S: D9 b3 X8 ]        {
    ' K/ H4 h0 B9 Y$ f& v                std::generate(vec1.begin(), vec1.end(), []() {
    6 m  ^/ t9 }% D- Z9 ~+ v                        return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;" O% w, u- @! e6 s# a  r2 Z
                            });7 l9 c. w6 L2 v" `) `
      A* G! T% S& T$ h
                    std::generate(vec2.begin(), vec2.end(), []() {
      |& `4 d+ W, N; i. E8 v( g( \2 O' }" V                        return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
    , R  Q# ~: `% L                        });
    ( Q: q) J' @) O+ L1 [8 d9 v0 V  s, n- H0 m
                    for (size_t jj = 0; jj < vec1.size(); jj++)
    $ n2 R7 k, F2 H+ }! j: f5 J: v% \& x                {
    ' |" {6 y1 T( ]4 N; [. q# ?  A                        b1[jj] = vec1[jj];
    5 P1 [, d3 E& o; H/ X; F- B, I1 J                }
    # d  T9 B% K4 h5 K
    4 @$ V) J' O- @$ t, B! T                for (size_t jj = 0; jj < vec2.size(); jj++)
    # x0 U- ~$ r$ K$ g                {; I: V2 w- E0 `
                            b2[jj] = vec2[jj];2 K6 |# |! M0 C/ j
                    }
    1 e6 V# y4 v( M6 G" A' i, A2 m
    : \+ s1 L' l& r+ E$ M                //Method - 1  N=100000 247s  ' O3 U! J& Z6 U2 P+ p
                    //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);# W, L% s+ j" Q( \1 r* w8 w: z7 ~) B
                                    0 P* z6 n& ]: J  q- E+ R
                    //Method - 2  N=100000  237s' d" p" s& t% z/ c
                    /*: K) l7 |! V  Z4 w9 G7 N, _
                    for (int jj = 0; jj < N ; jj++)
    " o- H  D$ D$ T" S1 T6 g1 A5 K                {+ L0 \1 e0 a# b/ F8 U3 \
                            fresult += vec1[jj] * vec2[jj];
    4 i6 k8 E2 W% S- b* Z. K/ p$ h- L                }
    - o6 u* R9 c3 G: O7 g1 n8 L- W& f                */
    & d0 J! e5 R( ?4 f. R% _1 O                                
    / l) N" Z' U: W) e0 O0 `: G                //Method - 3  N=100000 204s
    . ]+ w1 G0 ^$ X                /*
    ( ^" m) N% r- a- s                for (int jj = 0; jj < N; jj++)) L0 t. [) |% h$ L  Y' I1 f3 n
                    {9 I/ t6 h( X# Z4 z' f
                            fresult += b1[jj] * b2[jj];/ Z1 t: K0 M+ F9 A- U
                    }
    5 A! q) K8 u+ m1 z# a, s1 A                */1 H0 J# ?* s0 U  q) R/ }

    # x& g* P# ~$ k6 H                //Method - 4   202s7 t! _, q+ z7 j0 d! S
                    /*  L; E" _0 z3 y$ j4 B0 p3 r
                    for (int jj = 0; jj < N; jj++)
    + ]* S% Q/ Y9 O- ~2 q                {
    ( j& V$ A7 I* P. S/ [- \                        . x5 m5 i1 n) F9 t1 C, _) O( d3 }
                    }
    ! \" N- u- D& v+ b                */1 C5 e4 e% `/ v% E: ]4 i) M& ^
                    //comment out all methods, N=100000  202s                ) H8 s: z3 J) M5 a6 }4 C2 ^! b
            }
    + w- U( v- w9 s" Q
    - S. d  p1 u! h2 J9 F+ y# Z$ H3 x        delete []b1;0 O# K( R1 O& l/ e* j; o: t
            delete []b2;
    7 r9 d5 m( b4 `: c; n: ]6 U% c% E
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    16#
    发表于 2022-9-27 00:15:38 | 只看该作者
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?3 Y1 O0 y/ I5 O$ w0 X* |3 x7 c# V

    4 W. ^  h  J  @6 A) Y你第二个试验里面的j在循环里面又重新定义了啊,你确定真的跑了6000次?7 I! G3 i7 s& q7 x
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    17#
     楼主| 发表于 2022-9-27 01:16:03 | 只看该作者
    机器猫 发表于 2022-9-27 00:15
    * c3 [$ I5 [3 H" |瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?4 {: U+ S9 _: C5 b6 g

    ' l  D1 d9 E- B. Z: r( u, x* {. J你第二个试验里面的j在循环里面又重新定义 ...
    & s: h1 N8 Y8 I2 T8 j' }- O
    内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL. r" m) _: r( e7 l
      o; [2 v* e9 o0 C) e6 @
    不和它较劲了,瞎耽误工夫,我已经转到 ubuntu, 也准备顺便试试 avx2 向量化。
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    18#
    发表于 2022-9-27 02:06:58 | 只看该作者
    雷达 发表于 2022-9-27 01:16. N& E# t" D: n6 T2 T9 F
    内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL7 ~* s  e: s' Z  @& U% k6 |
      O' \& T; t! }' l
    不和它 ...

    % Q( Z# {# _$ r' _. F1 D
    % ^% q/ O- b- C; t% E不过可以试试我说的register变量。前一个试验j是混在一堆其它变量里一起定义的,很有可能是在stack上,这样内存读写会更多,要是再碰上每次都需要加载cache就更慢了。' ~2 r% l- d" {9 s- l
    后面一个是在循环那里定义的,说不定编译器就把它优化成register变量了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

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

    使用道具 举报

    该用户从未签到

    20#
    发表于 2022-9-27 20:29:50 | 只看该作者
    雷达 发表于 2022-9-24 23:54
    * N: J* }1 [' O" w  Dvoid xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    + g( s- Z1 F, O{
    # q2 L; ^" E6 {  P: L2 P        comp temp, xtimesy;
    3 ~0 o7 e  K4 F7 b. j& P
    这个code里面如果Openmp没有被注释掉的话,那么temp那个变量应该是定义在循环里面,否则线程之间会存在争夺写入那个temp的风险。
    - J; I- \/ R1 k内层for循环如果没有内部操作的话,编译时应该被优化掉了,和你完全注册掉整个循环是一回事。可能你的编译设置没有打开优化?
    0 _1 d' Y0 o7 z, j4 fVS社区版没有问题,我工作用的就是社区版,设置正常的话不会比商业版差。以前游说头头用Intel Compiler,他说不想花钱,而且差不了多少,就一直用到现在。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2026-3-6 13:15 , Processed in 0.099486 second(s), 19 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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