设为首页收藏本站

爱吱声

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

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2022-9-24 22:54:26 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
    C++ 比 Octave 慢好多,怎么破?1 d  D% e7 e$ L& }  q& z. F: ?; k

    ; N! o! `7 G8 x3 D' k" H* S6 E自相关两层循环,内层循环涉及浮点数计算,试验了一下把内层循环内部全都 comment out 只留个壳子,  但空的内层循环本身就把速度拉下来了,看来问题并不在浮点计算。+ `7 _1 F- n9 V, f2 j

    5 v- d: z- w6 k9 P: P速度优化问题真的很有意思啊。! k& y, @; e6 g1 l2 a9 z7 e& [

    9 y) N$ j3 ^' e# Q欢迎大家继续讨论

    评分

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

    查看全部评分

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

    [LV.Master]无

    沙发
    发表于 2022-9-24 23:04:16 | 只看该作者
    拉下来?拉多少?% S2 ^7 F8 w% A, f9 z  v6 P
    把代码贴上来看看?
    : i& l* o, V& K7 {9 B
    $ B0 a' z5 v9 t7 x" f0 k难道分支预测不准破坏流水线执行?不该啊。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    板凳
    发表于 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 k, o( l" ^3 }0 V8 Q$ G
    数值分析 发表于 2022-9-24 23:04
    $ w: u# S% t; H" a! r% D2 u! b# D拉下来?拉多少?9 M7 s" |/ X" W! G1 L/ U
    把代码贴上来看看?
    " J& ~3 Y1 U+ g# [- i2 _
    3 G% \/ Z% P! n# _6 s
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)+ F. v( E9 j3 O
    {
    9 ~; A+ I9 u' ^3 Q/ q        comp temp, xtimesy;! E; I7 {5 [# V( b
            xtimesy.re = 0;
    / l1 ^- D8 ~/ B/ E( F% k2 s        xtimesy.im = 0;0 U/ [4 k$ L0 ]; c! v
            int j0 = lenB - 1;
    6 H% T  A3 @0 c2 K# b# y        int    i, j, i1, reali;
    ; m, i# ~# {$ y0 Y  v4 c        if (lenA % 2 == 1)( X% G. n/ i7 F9 O; S
                    reali = lenA + 1;" Z% N, [' Q0 c: w
            else
    # b; P2 t/ ~! ~4 p* f! k5 X3 u                reali = lenA;
    - ?8 C5 h  _+ s7 F        reali /= 2;! H7 r2 t' A/ p% r( W2 ~' w. h
    - E" d" T6 ~( S
            int nconv = reali + lenB;
    . o! K  K9 x0 r/ v  _- w7 v2 f: V$ R        //#pragma omp parallel for
    5 E0 z1 ~* E. d+ k" b$ g        for (i = reali; i < nconv; i++)
    ) {- D1 p( Q' p$ k0 r( v& Q: }        {
    ( Q2 A4 e2 L6 E/ h: z! I# `9 i                temp.re = 0;+ r, Q* U3 O1 Q5 ^
                    temp.im = 0;
    + n1 c5 _& E7 h8 k6 v                i1 = i;
    % O' }% H3 k6 m3 U                for (j = j0; j >= 0; j--)
    / R* {* ?* C5 g                {
      ^: ]7 A  Z2 J, N/ m  a- N% I6 k                        /* floating date operation */
    5 }* i7 `4 n6 C+ O' k6 R                }
    / u0 w; `( Y6 |: J2 L7 N' J' O
            }9 l) e0 a8 q3 @7 y/ Y6 W8 G5 c5 m# Y
    }
    4 I( a0 ]" o" V4 m# m# p7 k/ J) p5 m5 L3 |! M; ]
    xcorr函数代码如上,comp是复数struct, 做过长度为11、19两个矢量的测试,和octave结果完全一样6 ]! ~" ]" L: W% G* ^

    & B* Z$ J! c& l' i3 x4 O红色部分是内循环,现在其内部操作都comment out 了, j0大概是 6000。
    ( E5 a, _! f2 T# Q现在call xcorr 100次,耗时78s.
    % d# W, A8 y7 W  G* v5 Z% y$ {( n) e
    如果把红色部分内循环本身完全comment out, call xcorr 1000次,耗时 <1s.
    * A. w6 H+ U& S: n7 L( H
    / s& m+ S* s) @' q
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    6#
     楼主| 发表于 2022-9-25 00:17:17 | 只看该作者
    风雨无阻 发表于 2022-9-24 23:33
    ) q* W! `9 e# Y: e: m, KMaybe Debug mode?

    / r5 ^. H2 k2 ~, u" ]
      j; ]: ?! C) {% D0 o不应该,看我上面的回复。
    # g' A# N1 e- w1 b% f' i) @, l  z
    4 S$ N! @! k7 M8 M' z/ a1 H7 Y我更怀疑是 VS 社区版的问题
    回复 支持 反对

    使用道具 举报

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

    [LV.Master]无

    7#
    发表于 2022-9-25 00:20:10 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 00:24 编辑
    ) g, ]8 N' t4 d
    雷达 发表于 2022-9-24 23:54: B5 F; b/ B" t
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
      X  X, x! B7 W1 R- R" v{; ]$ Q* X7 J' p0 Q
            comp temp, xtimesy;

    0 _, m+ d0 r7 [0 i# V  ?
    6 e% t( g3 i" D( G6 J, w& L8 Q$ m这个不是这么比的吧。。。
    0 S: g& V- k8 D+ M0 i/ l$ y4 o* K- }! g, ?/ P: A2 }4 ~
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    " @# F  s* N# y( _, b- |2 u5 t
    而加上内循环,光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 X7 N( N" W. q7 S3 |
    数值分析 发表于 2022-9-25 00:203 c$ W7 V% D: h1 v& S! Y3 p  G
    这个不是这么比的吧。。。
    % W% }& q& e: z8 t5 V* C! B) c5 ?# X  d! D% N! o
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。

    0 d) y* d$ z  @; Z) j+ [
    ) v1 R7 _5 N* x2 G' [# H9 o/ q有道理。6 n8 |9 X* b9 x9 z. c3 [
    所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,记得 numeric 库里有算向量内积的,我回头试试。5 X3 N0 r# e+ U7 f# O# y7 U  N
    0 e9 V; i8 F% X* _: P
    我先尝试尽量用标准库,一个小程序,不想搞得太复杂。多谢了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    9#
    发表于 2022-9-25 01:27:53 | 只看该作者
    雷达 发表于 2022-9-25 00:46; X6 P+ V. W1 o; s* O& ~
    有道理。
    9 V+ C  Y9 @( [0 g% n/ Z6 Q- l所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,这大 ...
    ! `7 t2 N; U. S: f$ F% o8 d
    你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子,把循环本身翻译成机器指令loop或dec/jnz,两者速度上会差很多6 {9 q8 |6 X3 |  h3 I) ^
    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
    / C$ a+ _% B& s! b3 ~这个不是这么比的吧。。。
    2 A# t9 u+ H; q1 P& w% U! n: O9 b2 J* t
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    而加上内循环,光jmp和dec指令就至少多执行了6000个

    # v% P; \+ j* @+ K/ Z+ ~3 ?) P
    4 w9 N( U% j- h* p6 x现在的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 编辑 7 t# ~' a/ S1 V! S+ S# |
    沉宝 发表于 2022-9-25 01:481 v7 w/ X2 }1 `3 ~5 ?0 K1 E# O1 u$ M
    现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果 ...
    # L4 w4 U8 |6 k
    5 R& i5 e9 ~6 m7 ?! b9 ]: R) ]5 d7 P3 T7 L
    是的,兄台说的对。
    & x9 W/ O, ~/ C; ?% y' D0 M1 C
      f# g  v4 f: }( k8 o/ U" q* T其实我想说的是 真正数值计算部分和代码中其他不直接计算的overhead的比值这个事儿。
    $ [. M( w/ F- b& u1 `; i6 z! g& O$ C9 o* X" Z
    雷达兄构造测试用例的时候,屏蔽掉了所有计算的部分,使得剩下的都是overhead,这样run time比较的结果就显得好像不合理了。如果把计算加回去,计算部分的run time会dominate,结果就不那么离谱了。因为不好说,所以用指令数对比的方式试图直观地说明这一点。
    9 Q5 _# m4 `7 Y( Y9 J; Z4 }+ g8 v; q# D" B- l2 \# J4 H
    比如说,如果有计算,那么跑六千个循环相对于计算应该用不了多少时间。但是如果一边是什么都不做,另一边是六千个循环,那六千个循环比什么都不做慢几十倍了,就不是那么不合理了。
    ' h) u  R3 X4 A& H2 U: j2 F8 G) [& k
    当然也有可能像兄台说的,是优化参数的问题,但我觉得更多地是测试用例设计的不合理。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    12#
     楼主| 发表于 2022-9-25 04:47:43 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 04:49 编辑
    & g- c4 u4 \0 {
    沉宝 发表于 2022-9-25 01:27
    . y0 }! h$ I  [# e6 O+ x你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子 ...
    + L( x* h: j/ L  s2 w* Q! `7 j" u

    ; X1 }9 @7 I2 ~& d' k7 Z7 f% w! Z又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差一倍,我上面这个差的太多了。
    ! G+ ]/ E! A2 f& S; X
    : D# L5 i! y% F; q% R' y7 M我已经完全懵了。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    13#
    发表于 2022-9-25 05:51:23 | 只看该作者
    雷达 发表于 2022-9-25 04:47
    - f/ j7 J% ~+ l2 }又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...

    5 `$ t: _1 K4 q# [. m# ~4 b7 N5 }* h时间差一倍的结果可以接受。! ?  t2 f0 H' Q% P7 E
    : U+ I# G6 t5 b' ?7 T5 ~( x
    你还是用profile工具看看吧。现在大家都主观瞎猜。
    回复 支持 反对

    使用道具 举报

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

    [LV.Master]无

    14#
    发表于 2022-9-25 14:58:59 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 15:38 编辑 , Z2 @) c7 V* [' M- m/ k/ g* r
    雷达 发表于 2022-9-25 04:47
    . l! }( s- ^! m又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...
    ( T1 B- {' b  Z  G, _$ k

    ; [) ]# O0 p# l3 y1 G& d$ P7 A
    * C6 M! ]5 x* d; w: |5 Q
    9 N6 l5 Y8 H. X9 j+ t2 M能不能把这个也贴上来,看看和上一个有什么不同?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    15#
     楼主| 发表于 2022-9-26 01:30:03 | 只看该作者
    本帖最后由 雷达 于 2022-9-27 01:17 编辑
    3 F3 Q% p* J8 n( C% ^/ ^: p
    数值分析 发表于 2022-9-25 14:58
    ' i1 G( \: \7 S1 f  z4 q8 r能不能把这个也贴上来,看看和上一个有什么不同?

    - @7 L; `) _0 {) u* }; R. X) b理了理思路,重新做了一个测试。3 b8 Z0 a8 w0 j" H4 ~1 L
    做了两个 vector 和 两个 float *, 都长 1000008 _5 ]+ g, N0 S$ P! [
    外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
    ! w, D( P1 S4 C* F; r: V. x) [: {/ q! Z, w6 Z  H
    内循环试了4种方法,8 D8 M  U. e; y
    1. 直接调用 vector inner_product 247s + \0 @# t3 d* u) N1 ?6 V) ?7 D
    2. vector 循环点乘累加 237s; b$ r, D9 P+ C4 A
    3. float * 循环点乘累加 204s7 ]+ X! }8 o; q9 e8 Y: Y- C/ G6 `3 h' R
    4. 空循环 100000 次 202s
    & F5 Z8 f5 z2 K. J& q* t- n( g( i0 d& Y9 z7 J9 ^
    不做内循环 200s+ [; b2 t. T% D* w+ C- F5 u

    2 A, `" V, y5 u你昨天说的对,内循环本身占比是很小的,大头在其他处理。4 b  ^2 K1 Y" z7 R+ }9 G
    另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
    ' `: a, N! {+ `! j( t! N. J' C2 {6 S1 z9 }( v% p
    至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
    6 I8 r2 y  |. l% [* @$ J
      c- n  E: |6 P( M(为什么下面我贴的  b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成  jj 好了,原来 方括号里的 i 是斜体标志  LOL), E3 M3 Z# w6 K0 T+ a- `5 Z
    5 |  b; _. O& F1 g
            std::vector < float > vec1(N);
    ( {: I+ Y  U) R" Y) p3 B: R" y# @4 t, p        std::vector < float > vec2(N);- C% M+ S$ o! v
            float* b1 = new float[N];
      X' q% c3 u9 G. w0 }0 x        float* b2 = new float[N];
    6 u0 h; H* `. M, z
    ) R- J; a. L/ J# L) [# N- a( h+ P" s        for (int j = 0; j < 6000; j++)
    3 r+ R  r2 W! e* M, K1 l1 E        {8 r' ^; @" l# V
                    std::generate(vec1.begin(), vec1.end(), []() {/ [" Z0 i1 L. p$ ^- l6 p9 K
                            return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;/ ~& v' E+ ~* G& p( B
                            });& }) C! B" J5 a+ d0 Z# f0 W4 z0 o
    8 R) j2 Z# J! k& `
                    std::generate(vec2.begin(), vec2.end(), []() {5 X1 u- J9 [! o; r
                            return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;& R0 ~  A8 V2 J) c+ n
                            });
    2 t+ r3 n! \2 x0 P6 q# e9 _% c$ n- D9 g8 u7 m
                    for (size_t jj = 0; jj < vec1.size(); jj++)
    " S/ T! G# {: Q) m! ?1 Y2 ~                {  o( J/ W0 F7 C0 D
                            b1[jj] = vec1[jj];" t4 J+ f( X) }- Z& g
                    }
    ! h. A0 I  S2 z0 r8 `0 W
    $ {: t! R. |, D7 e- a9 i                for (size_t jj = 0; jj < vec2.size(); jj++)
    6 z6 L0 C- E' B                {7 p, y& ?( ^$ N0 \1 G/ }- k# o
                            b2[jj] = vec2[jj];
    , W: p  |6 C" R! Y- u" {, A                }7 `4 G; J& |% y

    3 Q% q- D+ a3 E3 f, u( u                //Method - 1  N=100000 247s  
    . a! j: X: s; z1 z3 V                //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
    1 @4 z  h4 T2 d: p: x* T# X                                1 E& ?) p6 [/ a7 v
                    //Method - 2  N=100000  237s0 f/ ^9 ]0 M9 b; `& ~1 T
                    /*  Z* d9 `6 b2 w
                    for (int jj = 0; jj < N ; jj++)1 \: j, e  }0 k. r
                    {
    # p) k# y, E( `( _                        fresult += vec1[jj] * vec2[jj];
    ; T4 e- H' \; I9 }/ q" y                }
    ( g# E' o* @2 l0 L  N- ^                */
    1 W7 s3 A# a7 q6 K7 U                                3 r2 b0 q% e; F" J  H9 T3 R0 M* i# b
                    //Method - 3  N=100000 204s
    - k3 f6 T4 g6 `% ?' \4 `+ m! Z3 ~+ M                /*
    6 a$ C( ^$ ^: _" ~1 B/ m' c                for (int jj = 0; jj < N; jj++)
    - I5 V* i, h" p  J/ b2 G                {, o9 S9 S; `& k
                            fresult += b1[jj] * b2[jj];2 R: \/ s/ L1 W6 w
                    }
    ' f" E3 T4 Y0 I) M9 i7 w: G# f3 }                *// X; F5 O5 f8 B0 \' d8 s* R! y  }
    2 l1 h# i9 L! A) J9 K
                    //Method - 4   202s
    . j& \' {  ?; d4 o) e/ y' g0 a                /*& E: e3 J' G' g$ r
                    for (int jj = 0; jj < N; jj++)
    * f9 v$ K1 M6 A* R6 d  i                {
    / q1 l" u; Z" E) w, z  \                        ( l" h" C6 F. M' A. y8 b/ n
                    }( e. J6 x7 l* j: _7 k  r' r
                    */% R- u: f$ j  w; p3 E+ S4 \8 B2 M
                    //comment out all methods, N=100000  202s                4 F5 o7 E2 S( U2 K
            }5 e& C8 E, @8 @3 P. }* ^) F9 A
    6 t) F# R+ j5 n, f
            delete []b1;
    & \* _9 w/ F+ d! n' V0 l        delete []b2;
    , d7 D; X0 l+ s; t( Y3 J
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    16#
    发表于 2022-9-27 00:15:38 | 只看该作者
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?. p) b, O7 ~6 @; }7 s2 B2 `: R

    3 o( a. L6 D: b2 u* E你第二个试验里面的j在循环里面又重新定义了啊,你确定真的跑了6000次?
    % M) [( Y4 m4 }$ z; j6 X
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    17#
     楼主| 发表于 2022-9-27 01:16:03 | 只看该作者
    机器猫 发表于 2022-9-27 00:15
    9 f. [5 m& H: x) T" n$ D瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?. F1 s" Y; Z5 V
    ( b" A6 s5 T  G* e+ [. w
    你第二个试验里面的j在循环里面又重新定义 ...

    * `% N# a8 Y- r! o) H内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL
    ! I6 w1 r0 m; p: V3 Q5 [* J/ f! o! }4 h
    不和它较劲了,瞎耽误工夫,我已经转到 ubuntu, 也准备顺便试试 avx2 向量化。
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    18#
    发表于 2022-9-27 02:06:58 | 只看该作者
    雷达 发表于 2022-9-27 01:16# q: A. o7 Z' H. d
    内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL( E5 q# k5 q' L; y4 K6 ^
    : Z8 E. B# @& O: r' f
    不和它 ...

    " w. ^" f/ j* n5 @. e" j* r3 M( B  h7 {( m
    不过可以试试我说的register变量。前一个试验j是混在一堆其它变量里一起定义的,很有可能是在stack上,这样内存读写会更多,要是再碰上每次都需要加载cache就更慢了。
    2 J- r8 I% Q$ ]. h( \# O! q后面一个是在循环那里定义的,说不定编译器就把它优化成register变量了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

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

    使用道具 举报

    该用户从未签到

    20#
    发表于 2022-9-27 20:29:50 | 只看该作者
    雷达 发表于 2022-9-24 23:54
    % Z, [$ C5 d& c& K' l% e& |void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)- [, v  B# ^8 w
    {
    - J2 [( T) C5 E# k2 C& J        comp temp, xtimesy;

    6 A0 z' G" r# v* G: a这个code里面如果Openmp没有被注释掉的话,那么temp那个变量应该是定义在循环里面,否则线程之间会存在争夺写入那个temp的风险。# S& i! z$ G6 [. e: P% P8 _
    内层for循环如果没有内部操作的话,编译时应该被优化掉了,和你完全注册掉整个循环是一回事。可能你的编译设置没有打开优化?% K! Z; w$ q6 M4 s
    VS社区版没有问题,我工作用的就是社区版,设置正常的话不会比商业版差。以前游说头头用Intel Compiler,他说不想花钱,而且差不了多少,就一直用到现在。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2026-7-6 15:08 , Processed in 0.069983 second(s), 19 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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