设为首页收藏本站

爱吱声

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

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2022-9-24 22:54:26 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
    C++ 比 Octave 慢好多,怎么破?2 z3 L( G+ `+ W% S
    5 N  ?( i1 ^- V+ n$ j' \0 J' D
    自相关两层循环,内层循环涉及浮点数计算,试验了一下把内层循环内部全都 comment out 只留个壳子,  但空的内层循环本身就把速度拉下来了,看来问题并不在浮点计算。9 o% S$ Q5 u2 M& i" Q% B, N
    : m1 C: ]0 R# }6 K
    速度优化问题真的很有意思啊。% r) J! ?( j0 ?) g
    . h5 _7 M+ `5 _7 ?6 M! v$ O
    欢迎大家继续讨论

    评分

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

    查看全部评分

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

    [LV.Master]无

    沙发
    发表于 2022-9-24 23:04:16 | 只看该作者
    拉下来?拉多少?
      L1 [% A, C# n1 ^8 @把代码贴上来看看?
    % y+ U* A- A* p7 V& F% t
    7 x5 s" ~" H- O# M, S难道分支预测不准破坏流水线执行?不该啊。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    板凳
    发表于 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 编辑
    # E5 a( O: y. N. T
    数值分析 发表于 2022-9-24 23:04
    # l+ W' }4 N% O* m. W. }; Z) T( H; ^拉下来?拉多少?
    $ s# e: y* P. G  [8 y/ c5 x) x) Q把代码贴上来看看?
    - T$ l0 i5 o9 C  _# T( H6 F
    / m6 d" r. c- w2 M
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    4 I  s* K$ j. v5 s4 |1 w3 t{
    0 A7 X/ n( ?" p* Z5 A" n; ~0 [0 ?        comp temp, xtimesy;
    ! s2 w) k1 @4 Q; J: a$ h. Z2 o( d% c        xtimesy.re = 0;/ m- ]$ x& u! \' X: R# D
            xtimesy.im = 0;3 o6 O* f- K% z4 i# k, K
            int j0 = lenB - 1;9 v! T+ J7 N: \  I, T. x4 h" O7 G8 R
            int    i, j, i1, reali;
    . ]7 m5 g. j; f/ ^, Q( N        if (lenA % 2 == 1)# ?8 C6 F  X' o1 X9 v, ~& d9 v+ c
                    reali = lenA + 1;+ E" b0 k( k3 i, e% o' }
            else  R0 k  N$ R. m6 z
                    reali = lenA;, F/ |& z- c2 k+ u
            reali /= 2;
    - B3 N7 G& F9 Z0 r  {/ L- r6 W: W
            int nconv = reali + lenB;
    , \1 _) B. g, Z4 R9 j        //#pragma omp parallel for+ O0 X+ z& n* {5 R
            for (i = reali; i < nconv; i++)! f6 A3 c* O' H8 r1 J( e+ @4 ~
            {
      T' o/ h4 W/ X  ^1 y7 U                temp.re = 0;
    # `; F) e2 i7 n8 y+ S/ B                temp.im = 0;, r3 Q+ M" e3 E& F8 j
                    i1 = i;- X6 l! c' i6 t# D$ O. O' V
                    for (j = j0; j >= 0; j--)
    9 H0 S1 u" E) _2 B1 ?                {
    ( Q2 f7 d6 {5 @+ W* C; D( a+ Q' |                        /* floating date operation */
    & W/ w7 p3 g$ M                }

    7 n$ H2 T6 o  c/ \2 Z        }
    ( w& u4 f1 l. |" e1 i+ \$ i, i}
    ( ^  j- F9 Q" Y# Z- ^
    - f2 K" P( ~  L6 ?" g8 {2 K* Jxcorr函数代码如上,comp是复数struct, 做过长度为11、19两个矢量的测试,和octave结果完全一样
    / \. o7 t5 h* T2 q! _
    " u4 |$ }1 V3 a* B7 C红色部分是内循环,现在其内部操作都comment out 了, j0大概是 6000。) A! b! T* }, M0 P
    现在call xcorr 100次,耗时78s.& F2 |# B( e( Q- \. |' w; I
    ' j8 z  i) |% C* r- M
    如果把红色部分内循环本身完全comment out, call xcorr 1000次,耗时 <1s. * _# O* O) S/ N1 n1 V; K
    3 J- K2 ~& d/ b9 E4 C* I9 U# A  x
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    6#
     楼主| 发表于 2022-9-25 00:17:17 | 只看该作者
    风雨无阻 发表于 2022-9-24 23:335 z7 y/ L, q' ~& F/ r
    Maybe Debug mode?

    , s- y8 x& H+ e: {* u/ z* X
    # q3 [) t9 Q2 ?# L5 d8 ^, M7 r( g) K+ l不应该,看我上面的回复。8 \. L4 J5 b" O+ F( j  @$ C+ e
    * @- K6 B7 ]# H" W5 p- W6 c
    我更怀疑是 VS 社区版的问题
    回复 支持 反对

    使用道具 举报

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

    [LV.Master]无

    7#
    发表于 2022-9-25 00:20:10 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 00:24 编辑
    4 {7 N, j+ \2 Y/ ?9 j5 U) _
    雷达 发表于 2022-9-24 23:541 L8 x7 X4 c) c6 d* M
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    % w1 @; |+ N% F3 [5 E) w2 D' [{6 E! d- c3 I  N6 _% ]& R: B& s$ Z4 r
            comp temp, xtimesy;
    & K* ?  b6 v' E; i

    . O: O+ Y1 D* K1 z1 y这个不是这么比的吧。。。
    , e* I) s$ x! C1 {" e
    ; Y0 c8 I( y, C! h! I7 ]您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    6 d# f. v5 r; J& A% p. S  k( M0 s( L0 s$ _
    而加上内循环,光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 e9 ]$ }- p9 g4 l+ i& [% @4 k
    数值分析 发表于 2022-9-25 00:20& h8 s! ?6 C, L7 m% N9 E: S
    这个不是这么比的吧。。。7 E, \7 ?) x( G
    / C9 Z5 U( N% x# g* H
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    ' g. Y( A& A5 t7 ]- ~
    ( ?* g$ M) m) z+ I% {8 ]7 o! j- s
    有道理。! _6 R9 Z% r+ R4 Y4 m* s* V9 D
    所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,记得 numeric 库里有算向量内积的,我回头试试。
    : T! h0 ?% Y) D' R2 o  z) i2 k% U
    " a: @7 Q( R# \0 H" F我先尝试尽量用标准库,一个小程序,不想搞得太复杂。多谢了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    9#
    发表于 2022-9-25 01:27:53 | 只看该作者
    雷达 发表于 2022-9-25 00:46
    / [8 V' ~8 E/ M$ L6 e+ @有道理。, |- i( v, V1 ^% ?
    所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,这大 ...
    6 }, i1 B; B: b# F( H7 K
    你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子,把循环本身翻译成机器指令loop或dec/jnz,两者速度上会差很多
    + Q* n7 r1 s& q1 T$ _( n8 j. qWhy is the loop instruction slow? Couldn't Intel have implemented it efficiently?
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    10#
    发表于 2022-9-25 01:48:51 | 只看该作者
    数值分析 发表于 2022-9-25 00:208 Z: N2 R+ ?6 Y2 e, t
    这个不是这么比的吧。。。
    : L! U! a9 h) [. \9 w
    ! x. [! ]2 t/ q/ b$ M您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    而加上内循环,光jmp和dec指令就至少多执行了6000个

    8 z! X  t/ J  X5 |2 C; H% D: \' K( S3 v  e7 `
    现在的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 编辑 ( O8 l/ q6 h9 n" D) r" M) x) t
    沉宝 发表于 2022-9-25 01:48
    . B6 R  d; _% u* N3 H7 [5 M( Q现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果 ...
    ; Z8 `% d9 o- b! e4 O3 V7 g

      K# I+ I0 P* \, C0 e是的,兄台说的对。0 N4 a* ?. B0 ^7 O  Y( A

    # h1 Z" K" A4 P$ ]8 Y; r其实我想说的是 真正数值计算部分和代码中其他不直接计算的overhead的比值这个事儿。! _! C! j4 Y/ Y4 b2 t2 \

    ' x. U0 R1 k  B雷达兄构造测试用例的时候,屏蔽掉了所有计算的部分,使得剩下的都是overhead,这样run time比较的结果就显得好像不合理了。如果把计算加回去,计算部分的run time会dominate,结果就不那么离谱了。因为不好说,所以用指令数对比的方式试图直观地说明这一点。
    # b, y! t$ s! B0 e
    8 s! @/ K  w4 }5 Y% }比如说,如果有计算,那么跑六千个循环相对于计算应该用不了多少时间。但是如果一边是什么都不做,另一边是六千个循环,那六千个循环比什么都不做慢几十倍了,就不是那么不合理了。# F4 Q$ t2 U3 u+ G8 Q

    . }9 v8 ~) {6 e0 D- R当然也有可能像兄台说的,是优化参数的问题,但我觉得更多地是测试用例设计的不合理。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    12#
     楼主| 发表于 2022-9-25 04:47:43 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 04:49 编辑 1 z0 k% g& [1 J+ F, g% @- I: G3 J$ ?
    沉宝 发表于 2022-9-25 01:27, H) }/ v" q5 K- Y$ ~3 z
    你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子 ...

    ' c  o$ c+ l7 @
    3 T& Y" _- h8 A% i( W; p又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差一倍,我上面这个差的太多了。. r7 {0 o' ]! A+ e$ [, e/ ^
    9 p/ k2 I9 _" N3 ~! m% x0 v
    我已经完全懵了。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

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

    : e  {1 y/ w1 R2 i) w6 ?' D时间差一倍的结果可以接受。
    $ a' W2 P! G, `- w2 V( X9 z0 `; [4 s1 G# I) g' L& V) i
    你还是用profile工具看看吧。现在大家都主观瞎猜。
    回复 支持 反对

    使用道具 举报

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

    [LV.Master]无

    14#
    发表于 2022-9-25 14:58:59 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 15:38 编辑 ) n: y7 M& [+ |* a9 s) i- T
    雷达 发表于 2022-9-25 04:47
    7 e, {8 x( q* G又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...
    6 P# t" Y" K* [! E( c
    0 j) B( i; g' L) i1 {. N
    4 |7 a; u/ X5 D3 C

    2 Y. A* D) y1 C- [' {& P能不能把这个也贴上来,看看和上一个有什么不同?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    15#
     楼主| 发表于 2022-9-26 01:30:03 | 只看该作者
    本帖最后由 雷达 于 2022-9-27 01:17 编辑 8 S" V( _( r2 s) k# I
    数值分析 发表于 2022-9-25 14:58
    , e0 b8 C; p# P1 a( C能不能把这个也贴上来,看看和上一个有什么不同?

    - x* n, |" Q7 c8 ?% g9 t- M理了理思路,重新做了一个测试。) z6 V4 w. ]. s/ |/ M1 A
    做了两个 vector 和 两个 float *, 都长 100000
    ! {9 [. i( N! W7 @/ m8 r! Q" J* r外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
    2 z' v3 W1 B7 y) W; }/ E9 G) [9 L" y* w  i( ^' m# U
    内循环试了4种方法,
    ' ]/ @( H% \* [1. 直接调用 vector inner_product 247s
    0 M8 H5 ~# X7 Y2. vector 循环点乘累加 237s* N1 R1 R  m2 r, W( k# l+ J
    3. float * 循环点乘累加 204s$ S1 R3 r8 `4 h3 M3 u% d
    4. 空循环 100000 次 202s/ h3 C8 d; w  ]

    1 N; e5 O; K( s: i! j# e不做内循环 200s
    . A, L* i  q' |6 M2 Y9 n8 t" ~/ ?
    你昨天说的对,内循环本身占比是很小的,大头在其他处理。# _" ?8 Z7 f; [$ b) k  e" f
    另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
    - D4 |  e: r. R8 t8 U' k2 _7 O( E
    ! n4 j% F) }, d/ y6 q5 c至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
    ( ?" s" j% G1 c0 E) r. m1 u  P4 F( {; O* x8 Q& R9 w; N, u
    (为什么下面我贴的  b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成  jj 好了,原来 方括号里的 i 是斜体标志  LOL)
    % y1 F2 I* I# g: _2 [/ {  O* W5 x$ H  s- _% L' o" X8 ^5 [6 Q
            std::vector < float > vec1(N);0 i6 P' d" T: R  Z
            std::vector < float > vec2(N);1 l" e0 v6 D2 P0 K& o
            float* b1 = new float[N];$ A1 f* }8 w* p: |/ {! @3 f
            float* b2 = new float[N];
    # d) \1 |7 @2 E! z2 x
    5 i' I9 ^, [4 _$ q        for (int j = 0; j < 6000; j++)- i% `6 ?. ~0 h' r
            {
    & h: z2 F2 \, n6 g) B9 ]                std::generate(vec1.begin(), vec1.end(), []() {
    : p% p5 }) M  L8 y                        return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;$ T1 L9 M. q0 ~* E: Q; L8 O) B
                            });
    5 M3 N4 i: H$ l) l! Y1 h
    & |9 M4 `# a# A: n' \  e                std::generate(vec2.begin(), vec2.end(), []() {
    $ a7 U2 n3 P2 g- {, `; W                        return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;. W9 U# c5 d" F
                            });7 T7 k/ n$ v+ U% F( g, o  r6 _: E
    / i) Q* U: y* g* N7 u' U" v
                    for (size_t jj = 0; jj < vec1.size(); jj++); p: i. H# G4 g' A$ K1 ~" I
                    {2 S9 j1 f# H# N0 I! }
                            b1[jj] = vec1[jj];
    & x! Z! U3 P  K8 R. u                }
    5 i) [2 K! r; m- m2 n) ?
    3 r+ g: B0 W. P1 p3 X                for (size_t jj = 0; jj < vec2.size(); jj++)+ X) o- a1 H! s
                    {
    " a! C0 W0 V, N! X- E; B9 E1 ]( }                        b2[jj] = vec2[jj];3 G0 G0 x, V. C' q) y
                    }
    ) }2 R3 Z+ |9 I
    4 W8 ?" q6 G1 y: t, A' E  j' f                //Method - 1  N=100000 247s  + M4 A( \& D$ B+ @
                    //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);: r, j6 }6 z" }0 w* `
                                    
    - G$ N6 ]8 m" D- R+ T6 _                //Method - 2  N=100000  237s
    * T$ _( k# O- W% {( O! }                /*1 F, }; Z6 J' R1 C0 q( L
                    for (int jj = 0; jj < N ; jj++)3 n: ^) M- L+ Y# w
                    {
    3 O" Y" H* @5 F, R$ y                        fresult += vec1[jj] * vec2[jj];
    % p  |& T" v8 {4 Q$ w8 B0 P                }4 P: c* B" O9 \
                    */0 X, y. A# ^& `  X7 d6 h  l! [* s6 [
                                    2 B" q% \1 _$ \4 c. `4 ]  E
                    //Method - 3  N=100000 204s$ L* a9 u) G, v( K
                    /*
    1 g" F; c2 _8 N6 e                for (int jj = 0; jj < N; jj++)
    : m: G4 O3 H- W' X2 e5 j: `                {
    # F  E) `# J' A+ {6 v8 g8 g3 v                        fresult += b1[jj] * b2[jj];
    ' ^/ h4 z1 |! a! l* Q                }7 i# @. C& o& q8 j: X1 Z
                    */
    2 e: ?" T8 A6 O/ V2 \  \2 l( Z; k: K0 {$ @/ r3 ?% v
                    //Method - 4   202s0 a% s- x2 |! H, V  o
                    /*
    9 n0 a9 {0 K2 G/ m                for (int jj = 0; jj < N; jj++)
    9 B$ J+ S8 E, O! \                {
    2 x6 V- x) {4 K+ T" ~6 l                        
    - y2 f3 z) k) A: L6 i" K: U                }0 _, x2 l. q" A" S$ N# W) o: k
                    */
    ( M" f! k4 R# \- `! j1 r7 u                //comment out all methods, N=100000  202s                - i* ^4 F6 k$ @8 X7 }& o  h- ^
            }. m, d0 ^% W8 V; K9 k

    % b* _9 s8 Q; A* F3 E        delete []b1;, ^7 S6 e5 m5 o! d, B0 b! m( r
            delete []b2;

    7 W: s( Q! {" g+ P1 ~) F* \! G  x
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    16#
    发表于 2022-9-27 00:15:38 | 只看该作者
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?
    / x( p# {3 g8 V4 M. q! \0 W- S, q/ K3 W' b0 t/ ^; G  R+ |
    你第二个试验里面的j在循环里面又重新定义了啊,你确定真的跑了6000次?, }2 N' ~$ i/ Y3 y
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    17#
     楼主| 发表于 2022-9-27 01:16:03 | 只看该作者
    机器猫 发表于 2022-9-27 00:15
    5 u  e# F6 S9 K" [瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?
    8 e5 j0 c6 H3 |0 `+ c; l) {( i: T- P, T* r3 O6 M
    你第二个试验里面的j在循环里面又重新定义 ...

    2 `, q3 W3 `3 [% i. b内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL: z+ H, v  c. E2 {9 V# ^5 e3 T
    ( {) R3 {; ]8 X! V2 k
    不和它较劲了,瞎耽误工夫,我已经转到 ubuntu, 也准备顺便试试 avx2 向量化。
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    18#
    发表于 2022-9-27 02:06:58 | 只看该作者
    雷达 发表于 2022-9-27 01:161 D% e8 h! O" w, ?& e$ V6 |. Y; s
    内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL
    ; {3 R$ d8 ]7 z) z3 r0 [5 _, L  C7 _! m$ S' ~! P7 ?/ ]
    不和它 ...
    ' H6 ~; K/ o! v; F0 l# N+ l
    ; T: k4 ?* \1 ^4 w
    不过可以试试我说的register变量。前一个试验j是混在一堆其它变量里一起定义的,很有可能是在stack上,这样内存读写会更多,要是再碰上每次都需要加载cache就更慢了。% Y* Z' U6 ^  E
    后面一个是在循环那里定义的,说不定编译器就把它优化成register变量了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

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

    使用道具 举报

    该用户从未签到

    20#
    发表于 2022-9-27 20:29:50 | 只看该作者
    雷达 发表于 2022-9-24 23:54
    5 D2 k( k9 Q9 i6 C% h2 \, |void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    8 W! T- w% {9 q{
    5 j) P! S! t- m/ u* E        comp temp, xtimesy;

    8 T/ S" e0 Z( u8 V6 h/ }/ k1 ?; M这个code里面如果Openmp没有被注释掉的话,那么temp那个变量应该是定义在循环里面,否则线程之间会存在争夺写入那个temp的风险。
    " w* m( _6 y3 Z& B# V2 j* D内层for循环如果没有内部操作的话,编译时应该被优化掉了,和你完全注册掉整个循环是一回事。可能你的编译设置没有打开优化?/ D2 x' A% x. Q) l7 U
    VS社区版没有问题,我工作用的就是社区版,设置正常的话不会比商业版差。以前游说头头用Intel Compiler,他说不想花钱,而且差不了多少,就一直用到现在。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2026-6-10 20:08 , Processed in 0.068105 second(s), 19 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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