设为首页收藏本站

爱吱声

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

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

[复制链接]
  • TA的每日心情
    怒
    2025-9-22 22:19
  • 签到天数: 1183 天

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2022-9-24 22:54:26 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
    C++ 比 Octave 慢好多,怎么破?
    0 K! a0 x6 n' z! B! C( t) \6 T5 V$ j; j, J) _4 B
    自相关两层循环,内层循环涉及浮点数计算,试验了一下把内层循环内部全都 comment out 只留个壳子,  但空的内层循环本身就把速度拉下来了,看来问题并不在浮点计算。. v* g% {+ G3 G4 W6 K
    ) z4 a% W$ |2 `3 {) P
    速度优化问题真的很有意思啊。
    5 r' h2 J! i5 X) k, `6 k  c5 N9 G$ l9 J# A* b3 \% a% ^
    欢迎大家继续讨论

    评分

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

    查看全部评分

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

    [LV.Master]无

    沙发
    发表于 2022-9-24 23:04:16 | 只看该作者
    拉下来?拉多少?
    ( q- t) N# [; l( H8 [把代码贴上来看看?
    ' h$ v3 L; k4 D2 d8 F7 o$ G
      E: F4 f9 A' G0 K1 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 编辑   H8 f4 W) Q  O4 X2 Z
    数值分析 发表于 2022-9-24 23:04  h, i0 S3 J4 e
    拉下来?拉多少?, p1 Z' V7 m- [  s5 T( c2 q, l4 d
    把代码贴上来看看?

    9 K& c$ j- D5 B( e4 C9 t! t; l& }5 E. K  R6 h) x
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)/ k; k0 R; Q. A
    {
    2 ]3 a: O; Z/ [) W3 c        comp temp, xtimesy;& ?& ?7 K- D  @8 b- L4 m) Y
            xtimesy.re = 0;, o6 |. F+ m/ a( o& K3 v8 p
            xtimesy.im = 0;; ]; @  o+ @! X2 v2 G
            int j0 = lenB - 1;6 ]2 t" s  J& q; L/ a! n0 O4 B
            int    i, j, i1, reali;
    ) u9 R* N1 {* _$ X+ b5 s        if (lenA % 2 == 1)$ K! o6 [+ G! K7 X! r
                    reali = lenA + 1;1 z; m- Z! ]2 b' R; B) r
            else
    9 Z" p  U/ ~" e8 K+ b2 l: Y4 ^                reali = lenA;9 ^1 ~& @$ G% \- V, P! ?
            reali /= 2;
    * I6 s9 P1 {" C& j$ a# M
    8 F) i5 z- z9 c        int nconv = reali + lenB;- V  P; Q  D8 e% {7 I
            //#pragma omp parallel for
    0 p: Q0 s* B' y        for (i = reali; i < nconv; i++)1 V' ~1 ~: \8 j% F$ S
            {
    ; L. I/ w9 U, e5 s9 L                temp.re = 0;
    2 x! x, S8 A4 C# w                temp.im = 0;1 s# `( L$ D0 w
                    i1 = i;8 {" ?0 ]- W' H' B7 Z$ d) k
                    for (j = j0; j >= 0; j--)! n) J0 Z" W# A! E: }
                    {" \. D4 P5 t- M- Z/ D: @7 y
                            /* floating date operation */! F; v4 R- c* `7 \% j7 U
                    }

    ! p5 _; E$ @- i6 b/ s# D7 L        }
    , G4 C* X: ^$ G& d' c}/ S$ B- I0 \6 X% `2 W: z

    / w" C" l3 |: J5 bxcorr函数代码如上,comp是复数struct, 做过长度为11、19两个矢量的测试,和octave结果完全一样
    6 p& Y) Y! I5 I0 v3 E2 ?! v5 `, O! \& j, s. Q
    红色部分是内循环,现在其内部操作都comment out 了, j0大概是 6000。
    - Z* n9 A' \7 v+ X0 {现在call xcorr 100次,耗时78s.
    - \: l6 h% z  W( E
    " r! u0 {4 z: _  o3 R) S+ n如果把红色部分内循环本身完全comment out, call xcorr 1000次,耗时 <1s. / g( E3 F2 n, M4 G, O, C
    ' P2 V/ m6 Y* z/ `
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    怒
    2025-9-22 22:19
  • 签到天数: 1183 天

    [LV.10]大乘

    6#
     楼主| 发表于 2022-9-25 00:17:17 | 只看该作者
    风雨无阻 发表于 2022-9-24 23:336 U1 D6 E% [8 R% v; |" r. {
    Maybe Debug mode?

    # H7 d" x; y. F* T' F, }
    + N/ l7 O( p9 w2 E. W不应该,看我上面的回复。; Z. c: J9 X# {) R9 x7 J* T1 G! ^

    , W: `0 P/ O. l. C7 A+ |2 R我更怀疑是 VS 社区版的问题
    回复 支持 反对

    使用道具 举报

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

    [LV.Master]无

    7#
    发表于 2022-9-25 00:20:10 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 00:24 编辑
    , z& Q7 n: X" G6 Y& P
    雷达 发表于 2022-9-24 23:54
    & a2 e5 T! v; Q  c/ C1 R* gvoid xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    " \- u! q4 Q1 B{/ \0 S6 N3 Y$ {4 S
            comp temp, xtimesy;

    . {* n$ K/ o! n) ~% A+ X5 v+ Z1 h: k6 s/ G! L9 r5 \
    这个不是这么比的吧。。。
    7 B* T$ U4 z' g" w
    / [( `' C- Q* g: T* ?8 ~, M您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。" \0 S8 x4 v$ ^; l
    % L* U9 k6 y( X; ^9 P. O
    而加上内循环,光jmp和dec指令就至少多执行了6000个,慢个几十倍不是正常的么?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    怒
    2025-9-22 22:19
  • 签到天数: 1183 天

    [LV.10]大乘

    8#
     楼主| 发表于 2022-9-25 00:46:56 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 01:09 编辑 3 S8 q! I3 d! S; e
    数值分析 发表于 2022-9-25 00:204 q; R: l, _" y1 {+ O& o
    这个不是这么比的吧。。。8 z8 Z" B$ _1 [- F

    - O% M$ i2 M/ \$ Y7 y3 s  {% U您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    " S" L' A' \$ N$ t

    , z9 \7 j/ F# B; ]: d有道理。
    6 V. J& Z: ~4 L( M2 e5 i' s所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,记得 numeric 库里有算向量内积的,我回头试试。
    8 m+ I0 c) X  q% y9 a9 `% R+ ^7 }7 I7 H0 [; l2 ]+ L
    我先尝试尽量用标准库,一个小程序,不想搞得太复杂。多谢了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    9#
    发表于 2022-9-25 01:27:53 | 只看该作者
    雷达 发表于 2022-9-25 00:46
    3 q2 N0 N+ w) Y有道理。. r0 c( b) m' u5 q2 }, L
    所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,这大 ...
    ' n: f& F7 H+ g& j" ^* |7 {
    你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子,把循环本身翻译成机器指令loop或dec/jnz,两者速度上会差很多+ D1 Y0 h7 S% t: L
    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
    0 k7 p4 H" B2 m# l. i这个不是这么比的吧。。。. J% K; v6 I* O
    $ N! I/ \6 t+ V9 p
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    而加上内循环,光jmp和dec指令就至少多执行了6000个
    2 B2 F% ^& l1 ^: E0 i( Y
    ! D, n- Y& A2 w) _
    现在的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 编辑 * _" b. f* w" B& }- v
    沉宝 发表于 2022-9-25 01:48+ Q  n$ r9 {6 G  B. e2 ^5 |) v9 i
    现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果 ...

    3 [$ n- s; I8 Q! g1 K4 K, u$ V/ {* [8 Y) S5 g9 d) Q/ b" {8 h5 D; ]
    是的,兄台说的对。
    + m: k8 k% s  W& V9 d% `% ?# u! O/ u8 _! x3 e% X! r6 \  n) Q
    其实我想说的是 真正数值计算部分和代码中其他不直接计算的overhead的比值这个事儿。1 z. Z) Q$ b0 _; c3 j: z# D

    # m* ~3 A7 O/ o( D+ Z6 o. {雷达兄构造测试用例的时候,屏蔽掉了所有计算的部分,使得剩下的都是overhead,这样run time比较的结果就显得好像不合理了。如果把计算加回去,计算部分的run time会dominate,结果就不那么离谱了。因为不好说,所以用指令数对比的方式试图直观地说明这一点。
    % b1 {& u& c' Z  h+ h3 }. m0 X8 `7 T, A( N
    比如说,如果有计算,那么跑六千个循环相对于计算应该用不了多少时间。但是如果一边是什么都不做,另一边是六千个循环,那六千个循环比什么都不做慢几十倍了,就不是那么不合理了。$ h. x& D$ C3 I% v6 U
      V$ V4 C3 U) Y" ^% r, i% F  b8 n3 E
    当然也有可能像兄台说的,是优化参数的问题,但我觉得更多地是测试用例设计的不合理。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    怒
    2025-9-22 22:19
  • 签到天数: 1183 天

    [LV.10]大乘

    12#
     楼主| 发表于 2022-9-25 04:47:43 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 04:49 编辑
    , H9 b$ e0 @6 \" P, l
    沉宝 发表于 2022-9-25 01:27  M# U- B8 M- a) {% n1 r
    你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子 ...
      b: L0 N1 _# Q+ Q# e1 G. w

    ; l, B/ Z; T! [) @6 S2 K& m, b又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差一倍,我上面这个差的太多了。
    . |# }8 U5 o; d" |8 z, H: _$ A3 g! I3 E. g, j+ s
    我已经完全懵了。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    13#
    发表于 2022-9-25 05:51:23 | 只看该作者
    雷达 发表于 2022-9-25 04:47
    % m/ o& [* I4 U% G又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...

    ' ?. C! k/ I4 L( |* {) H4 L时间差一倍的结果可以接受。
    % h/ {& g& _8 v1 U& M) z$ a8 ?0 o# _9 {
    你还是用profile工具看看吧。现在大家都主观瞎猜。
    回复 支持 反对

    使用道具 举报

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

    [LV.Master]无

    14#
    发表于 2022-9-25 14:58:59 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 15:38 编辑
    5 C3 N) P" X! u% O4 H  Y; i
    雷达 发表于 2022-9-25 04:47. d1 g5 e5 C: C% {5 _* q' B9 {5 ?1 E2 V
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...
    * m  |! _) k+ w( k2 X$ g

    + j# E1 x) k* K7 |5 C8 ]- Q' W# }
    1 O6 q  A# E* O4 _6 ?
    & ^: F- N+ R% ]5 ^  v* P能不能把这个也贴上来,看看和上一个有什么不同?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    怒
    2025-9-22 22:19
  • 签到天数: 1183 天

    [LV.10]大乘

    15#
     楼主| 发表于 2022-9-26 01:30:03 | 只看该作者
    本帖最后由 雷达 于 2022-9-27 01:17 编辑 8 h* K  ~" X4 k1 C
    数值分析 发表于 2022-9-25 14:58
    0 `5 O3 x5 b6 S1 ?4 X2 `, h能不能把这个也贴上来,看看和上一个有什么不同?

    1 i8 u" m9 Q2 C! L1 o* q8 i理了理思路,重新做了一个测试。
    . x+ D( l( Q( k! }8 I, Q1 m做了两个 vector 和 两个 float *, 都长 100000
    9 r5 q3 n4 W9 Q+ f外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
    ! j9 g0 Y' G5 \4 q! w8 F" n' F4 P% {4 m4 t
    内循环试了4种方法,
    . Q9 C/ L, V3 Z. k& e& U, I% b4 G% z1. 直接调用 vector inner_product 247s . t/ R6 H" N2 T) R, y
    2. vector 循环点乘累加 237s
    7 q9 a1 _6 }+ J6 K8 u2 A3. float * 循环点乘累加 204s+ N. O/ Y6 ]' u
    4. 空循环 100000 次 202s' A( `1 [4 F% G3 e" E

    7 x% ]1 Y" n4 P; c( h7 F# T, a. t不做内循环 200s9 C. B4 s* W( r7 A0 X' F5 l2 c: K
    ; o0 {0 A8 Q' ~. y# C' c
    你昨天说的对,内循环本身占比是很小的,大头在其他处理。
    $ h( Y- W  J0 b另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。( s6 h: n+ {9 p

    ) S% }7 ~* {' [) E$ h2 O4 A至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
    & c/ D: X6 O4 T1 d. n! [1 n: I" i7 Z6 a. v) m) o0 f
    (为什么下面我贴的  b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成  jj 好了,原来 方括号里的 i 是斜体标志  LOL)
    ! u' L, C2 g: S9 [5 s9 _) f8 ?( D) ^  `  P' F2 y4 q( C
            std::vector < float > vec1(N);# i: z8 ^! l/ Q1 ?9 z2 `
            std::vector < float > vec2(N);6 E0 l3 ~& z, Y4 D1 c6 n
            float* b1 = new float[N];  n: l0 A/ |( c1 L8 @& M1 l
            float* b2 = new float[N];% A# w  T% k5 k/ ]4 U

    ! ^7 `% p# t. R7 |' H" r  ~7 J+ c        for (int j = 0; j < 6000; j++)
    7 \( T5 _4 R! [# {        {0 M8 W& S, W' ^( m2 R4 @7 _
                    std::generate(vec1.begin(), vec1.end(), []() {
    1 c. U; \6 p5 N9 H3 D% E; _                        return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
    # X4 M; e1 J: J# a% S                        });- Q9 `. x$ j/ g' _

    3 I- C) ]6 X5 X. b                std::generate(vec2.begin(), vec2.end(), []() {" d- ?& t% E+ v) f: i% n! O# ^
                            return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
    ; B8 Y7 s% G1 C, B+ H+ _+ T5 T+ v                        });- a- N, W0 F; t3 b
    2 q- B1 z2 G' h1 e/ @
                    for (size_t jj = 0; jj < vec1.size(); jj++)
    * V: d: N* u7 T) r5 S' Q                {' U% f6 P: S% W0 P3 C
                            b1[jj] = vec1[jj];) |: t6 w: o/ D9 L5 A; P
                    }
    ' O0 f' p; C$ T. p- R: H1 _1 b+ [* |0 I" M+ g$ V5 K, s! J% G
                    for (size_t jj = 0; jj < vec2.size(); jj++)! B6 I' L: {# `+ v- @
                    {9 [  i1 F4 c, H2 ~# S( A# H& ~) d
                            b2[jj] = vec2[jj];* a* s  J. B4 g1 {: G
                    }
    - N. t$ X: Y! }. Y7 y) @4 ~3 w! @) V
                    //Method - 1  N=100000 247s  
    2 ?8 L2 Q$ ^+ H) g0 j3 Q  w' \                //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);9 k$ |# @; g$ J, s  B  v
                                    2 b$ E9 }' J; Z/ t4 o, L/ b
                    //Method - 2  N=100000  237s
    * E$ b5 E% E7 i: `+ _- |/ ]                /*
    # a$ \. {& D0 i( m6 a                for (int jj = 0; jj < N ; jj++)" S% \  e; c2 }6 S- Z. M' b
                    {
    7 b' n3 ]6 \( N% K# B1 R                        fresult += vec1[jj] * vec2[jj];
    3 R9 z3 e# k% U! Y2 i8 ]                }
    5 b+ I5 y* M: l1 w                */
    ' |9 l2 S: W, K2 M$ f7 @7 Q                                
    2 C0 g1 q5 d* o2 l2 X$ f                //Method - 3  N=100000 204s
    2 D9 Q& Z4 v9 O0 D" l7 i1 ?$ W                /*
    : T$ j) I( F" c# ]! C5 l, B1 [                for (int jj = 0; jj < N; jj++)
    3 T$ L$ y* s) N9 Y5 a% ~" c- e                {; \% j% A( h! N. g2 u( ]( v$ }2 a  d
                            fresult += b1[jj] * b2[jj];
    ! a! j2 K0 ?2 {$ B& ~& z, R% H                }
    / ]7 W9 A# e3 q; L. q                */
    . y8 M4 h4 Z0 }8 E3 i' V' q2 m. f# Q" t
                    //Method - 4   202s
    9 j7 B* O5 P+ }6 Q                /*
    ! m. F' N: t- _1 \% u; e                for (int jj = 0; jj < N; jj++)' o9 I8 O& P9 h; e) \8 F# m( e
                    {
    8 v# r3 P1 \9 o9 J! O  ~# ?. x                        
    ; c1 U! a0 A- q' X                }
    . N2 g/ W. A7 d; d9 r+ x                */$ T  [; B" C9 O7 b4 ~7 l5 F$ A' M
                    //comment out all methods, N=100000  202s                7 l2 w$ @0 k9 P0 @
            }
    5 l6 x0 i- k" ]; {: M4 F: U$ \4 q$ g: g7 F' S' W2 h
            delete []b1;
    9 q8 {8 s# o7 k6 u) L8 R- a        delete []b2;
    / p+ j: x: i3 R0 W  S/ }- p* Q
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    16#
    发表于 2022-9-27 00:15:38 | 只看该作者
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?
    / _! y% i; p2 I! b1 p7 s
    2 P/ A/ M+ C3 _6 r) |/ D你第二个试验里面的j在循环里面又重新定义了啊,你确定真的跑了6000次?
      p, C8 v; g: j. u5 ~! m
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    怒
    2025-9-22 22:19
  • 签到天数: 1183 天

    [LV.10]大乘

    17#
     楼主| 发表于 2022-9-27 01:16:03 | 只看该作者
    机器猫 发表于 2022-9-27 00:155 M) ^. h( ?' X8 T# j. G
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?1 n* d* A. V$ ]3 s) {1 \
    0 N! j5 ]  U; N7 Y7 K9 u
    你第二个试验里面的j在循环里面又重新定义 ...

    2 H$ x8 C/ i) T/ R; D( Z% q内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL) p  ]* j4 o; h- P1 k  n
    6 H& O+ F% w* k$ |
    不和它较劲了,瞎耽误工夫,我已经转到 ubuntu, 也准备顺便试试 avx2 向量化。
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    18#
    发表于 2022-9-27 02:06:58 | 只看该作者
    雷达 发表于 2022-9-27 01:16( a, n2 Y- S! W4 T
    内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL: R2 n+ |* s4 r$ r. J, t4 B
    - N- l! F# a( o3 s/ }( A
    不和它 ...
    " s2 U) ?8 B# p( y6 ^- i- j/ H
    . F/ Q- z9 R4 `
    不过可以试试我说的register变量。前一个试验j是混在一堆其它变量里一起定义的,很有可能是在stack上,这样内存读写会更多,要是再碰上每次都需要加载cache就更慢了。
    3 T4 J( r( N8 ~! s/ y后面一个是在循环那里定义的,说不定编译器就把它优化成register变量了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

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

    使用道具 举报

    该用户从未签到

    20#
    发表于 2022-9-27 20:29:50 | 只看该作者
    雷达 发表于 2022-9-24 23:54% L1 X* m3 M$ z2 J5 }$ L
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)- R' \% D! L  J' T' c2 A, {! F
    {
    / s; x6 c: h* T        comp temp, xtimesy;
    1 Z3 I8 Z* W; V
    这个code里面如果Openmp没有被注释掉的话,那么temp那个变量应该是定义在循环里面,否则线程之间会存在争夺写入那个temp的风险。" L0 b+ s% D) b2 g6 \
    内层for循环如果没有内部操作的话,编译时应该被优化掉了,和你完全注册掉整个循环是一回事。可能你的编译设置没有打开优化?
    5 s" |; N3 D3 h# w6 D% mVS社区版没有问题,我工作用的就是社区版,设置正常的话不会比商业版差。以前游说头头用Intel Compiler,他说不想花钱,而且差不了多少,就一直用到现在。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2026-10-13 09:01 , Processed in 0.077039 second(s), 21 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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