设为首页收藏本站

爱吱声

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

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2022-9-24 22:54:26 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
    C++ 比 Octave 慢好多,怎么破?
    , z$ C, X4 M1 S$ c# \" v) A9 c+ P6 C! d5 ]* n& T! {
    自相关两层循环,内层循环涉及浮点数计算,试验了一下把内层循环内部全都 comment out 只留个壳子,  但空的内层循环本身就把速度拉下来了,看来问题并不在浮点计算。# m$ n, m' J+ l' n' a5 ^0 m' A
    $ {" ^% x5 `8 b0 V" J* L
    速度优化问题真的很有意思啊。) W3 O4 }2 i" E3 Q+ f" Y

    5 G3 L- C1 o* }欢迎大家继续讨论

    评分

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

    查看全部评分

  • TA的每日心情
    开心
    2025-10-27 04:12
  • 签到天数: 1953 天

    [LV.Master]无

    沙发
    发表于 2022-9-24 23:04:16 | 只看该作者
    拉下来?拉多少?4 A+ D5 I+ v& O: W" i) U
    把代码贴上来看看?
    $ q  m$ r9 m; j& N9 I' ]" L" Q: u7 b7 X5 B& |
    难道分支预测不准破坏流水线执行?不该啊。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    板凳
    发表于 2022-9-24 23:15:41 | 只看该作者
    会不会代码本身的缺陷阻止了自动优化?另外,硬件配置和开发环境可能也有关系。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2025-6-14 10:13
  • 签到天数: 124 天

    [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 编辑 ; U$ }) s2 O3 G+ G
    数值分析 发表于 2022-9-24 23:04! b- ^7 g" a3 Q- U
    拉下来?拉多少?( l9 B8 F, u$ K1 |- y' s0 {' V, o# m+ w
    把代码贴上来看看?
    * s0 a: d0 K6 B

      G+ S% q% S! R$ q; g9 l4 }6 h8 M- Z. Dvoid xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)2 m$ T+ Y0 |9 j3 F1 p: X  V
    {; i+ I1 u& E5 H7 X( P  @
            comp temp, xtimesy;' R' ^( z; T: D
            xtimesy.re = 0;4 k& O: T& l. e
            xtimesy.im = 0;
    8 l" S4 a! c/ ?6 D% z3 V* g        int j0 = lenB - 1;  b" h3 N( }0 L0 P
            int    i, j, i1, reali;
    & s2 D' @' U2 r6 j        if (lenA % 2 == 1)
    , _- r8 h5 X* z+ ]4 R) k2 R5 c                reali = lenA + 1;
    9 u" \, \  @6 z3 S  I        else; j& x* i6 q/ m; l
                    reali = lenA;) y: @- b& J) z( P; }/ M+ `
            reali /= 2;) q, ~  w; B( R6 b% O* {. c
    : e6 Y) |& T& }
            int nconv = reali + lenB;: H" s$ E5 K9 G* B# ]
            //#pragma omp parallel for
    ; B: n5 T7 k' A4 `3 \: {        for (i = reali; i < nconv; i++)
    + p- r$ h+ ~7 R        {% r1 h3 y6 b! ]; I/ a6 p
                    temp.re = 0;; j& `' h0 D- P, H1 |, D8 m
                    temp.im = 0;4 F9 g8 R* |4 K! ]' W
                    i1 = i;2 K+ V) E1 X+ Y/ g$ B2 d) i$ [
                    for (j = j0; j >= 0; j--)
    8 w3 V6 ^5 T7 w: ?( a3 ~$ F1 t                {& B1 p% g1 r$ D
                            /* floating date operation */+ f4 j( t$ ?% X* o) j& A
                    }
    3 S6 a9 y5 V$ |% k" c
            }1 Q7 @( w, j* ~. G
    }
    1 K/ [5 c) m9 t% \
    * |* A. f% S$ y; Y( W& V$ C0 Zxcorr函数代码如上,comp是复数struct, 做过长度为11、19两个矢量的测试,和octave结果完全一样' T+ x! O' M% b$ c! [7 b# e
    + o9 X  C% G2 \1 v+ m1 ~6 I
    红色部分是内循环,现在其内部操作都comment out 了, j0大概是 6000。
    2 b: T6 f$ e6 Y) k现在call xcorr 100次,耗时78s.0 F$ X1 f, B) z) X3 j* x
    ; Y7 q4 _; ^# y( h' T# U8 ~% {3 G
    如果把红色部分内循环本身完全comment out, call xcorr 1000次,耗时 <1s.
    . s- K: h. a3 l1 k! f
    # Z3 M7 G6 `) b- Z/ Z# T' [
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    6#
     楼主| 发表于 2022-9-25 00:17:17 | 只看该作者
    风雨无阻 发表于 2022-9-24 23:33
    # J0 v: R$ G3 y& i' o. UMaybe Debug mode?
    . C0 x* D  w! \8 ]

    # x+ e+ d1 Y- Q0 v不应该,看我上面的回复。+ l/ d( l1 e+ z: j5 T

    $ j( o3 I6 U5 F1 G8 B2 j0 z% r$ M我更怀疑是 VS 社区版的问题
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2025-10-27 04:12
  • 签到天数: 1953 天

    [LV.Master]无

    7#
    发表于 2022-9-25 00:20:10 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 00:24 编辑 2 t0 o4 R% {- \, ?
    雷达 发表于 2022-9-24 23:54
    2 ?/ d/ T9 j3 A% hvoid xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    $ Z1 ]$ S5 N% f  ]4 s" K( Y1 h- a, s{7 F' X: P8 p6 A0 z  g; N
            comp temp, xtimesy;
    3 w' u& S% n9 S4 S2 T/ p) i

    / d3 B* ]2 C& b1 p1 W/ }这个不是这么比的吧。。。
    0 ^' J/ S! |( X" O( X+ O  l6 [! \; F) Z- ^) J' Q5 S7 Q1 y# @
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。8 K2 A" R2 z) @

    3 h6 j. G" _1 w  _1 c" f8 |而加上内循环,光jmp和dec指令就至少多执行了6000个,慢个几十倍不是正常的么?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    8#
     楼主| 发表于 2022-9-25 00:46:56 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 01:09 编辑
    , j: w2 G, ?7 e  ~4 Y0 m2 I& B
    数值分析 发表于 2022-9-25 00:20$ \5 |5 l( z1 d. ^& l1 S4 }
    这个不是这么比的吧。。。
    - X) Y& @) l1 X  O( {! o6 Z. q0 H' e7 r( ?, _; `. X
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。

    0 d2 C- d6 i: W+ D/ f" r! U$ z" O4 k
    有道理。5 S1 Q8 Y- Q, t% A
    所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,记得 numeric 库里有算向量内积的,我回头试试。
    " k) ]* _6 [- u; H- a& n" s2 M; E, {8 C6 J( k
    我先尝试尽量用标准库,一个小程序,不想搞得太复杂。多谢了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    9#
    发表于 2022-9-25 01:27:53 | 只看该作者
    雷达 发表于 2022-9-25 00:46  a# E9 H/ c% T: L' ^3 E
    有道理。
    , c/ ]! h7 D( u/ g4 F( e所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,这大 ...
    4 Z- s7 c: R0 p: D9 d6 [  a
    你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子,把循环本身翻译成机器指令loop或dec/jnz,两者速度上会差很多
    + {4 v/ t5 W8 v5 PWhy 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+ z$ `4 w) c; J+ p: }这个不是这么比的吧。。。
    4 @  |& ]( O; f. T9 h/ S& O! L7 O8 o! X# C
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    而加上内循环,光jmp和dec指令就至少多执行了6000个
    : ?0 N0 s* T2 O  E5 d6 o9 F
    ! M8 Z4 \2 F/ g# g7 a: ~: c* p
    现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果循环这样跑,花不了多少时间。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2025-10-27 04:12
  • 签到天数: 1953 天

    [LV.Master]无

    11#
    发表于 2022-9-25 02:06:44 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 02:16 编辑 2 D# |  g: I: e6 M# o3 [  F) g
    沉宝 发表于 2022-9-25 01:48
    ' K; ]  T" m8 u: t( I# Y0 O2 c现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果 ...
    % V) ]/ B7 ?) Y# }

    3 x2 L( E& ?( P是的,兄台说的对。
    , Z: H% R, Z) P0 N9 O" W( |. R: T- `* w
    其实我想说的是 真正数值计算部分和代码中其他不直接计算的overhead的比值这个事儿。% g! N6 {% \! @% C" n  r7 n% @

    ( H/ n+ i( C) Q# ^3 Q雷达兄构造测试用例的时候,屏蔽掉了所有计算的部分,使得剩下的都是overhead,这样run time比较的结果就显得好像不合理了。如果把计算加回去,计算部分的run time会dominate,结果就不那么离谱了。因为不好说,所以用指令数对比的方式试图直观地说明这一点。' p+ t0 n9 P- i# A/ d8 G: I, W- V
    . e7 H* q% G- P5 J) @( l! m5 ?
    比如说,如果有计算,那么跑六千个循环相对于计算应该用不了多少时间。但是如果一边是什么都不做,另一边是六千个循环,那六千个循环比什么都不做慢几十倍了,就不是那么不合理了。. B* h5 y5 x, w& J
    ! P. C$ f/ R& {
    当然也有可能像兄台说的,是优化参数的问题,但我觉得更多地是测试用例设计的不合理。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    12#
     楼主| 发表于 2022-9-25 04:47:43 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 04:49 编辑 9 w4 M, p. ?6 U6 u
    沉宝 发表于 2022-9-25 01:27
    6 H+ f9 S3 y- ]你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子 ...
    $ @# P* k9 z$ B# \

    2 r% L) t/ s9 U2 ]4 I  {/ }又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差一倍,我上面这个差的太多了。5 j3 B& }8 K% S0 s

    " F0 \8 k1 a+ U: {5 g5 _; v8 Q/ b我已经完全懵了。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    13#
    发表于 2022-9-25 05:51:23 | 只看该作者
    雷达 发表于 2022-9-25 04:47
    6 {  C+ G4 \: @: a, X8 p* `又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...
    3 t! m0 Q6 x; l  f
    时间差一倍的结果可以接受。$ R+ f. a& X1 x) Y0 ^# P

    , b3 Y+ ]9 a$ }" |8 Z你还是用profile工具看看吧。现在大家都主观瞎猜。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2025-10-27 04:12
  • 签到天数: 1953 天

    [LV.Master]无

    14#
    发表于 2022-9-25 14:58:59 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 15:38 编辑 ) @- I, b+ F" h7 m7 K1 |% n
    雷达 发表于 2022-9-25 04:47
    0 G# `' w/ M! P: ^% S  g) A4 d% I+ C又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...

    ; S$ Q/ s( T/ @( G& Z# [- C' V
    * a9 v# I0 N& b8 w; I' J0 z& k
    ) g5 m, C! @4 g( A8 ^
    ! _9 W: n6 Y/ d  o能不能把这个也贴上来,看看和上一个有什么不同?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    15#
     楼主| 发表于 2022-9-26 01:30:03 | 只看该作者
    本帖最后由 雷达 于 2022-9-27 01:17 编辑
    7 k3 A( F1 X$ {/ C
    数值分析 发表于 2022-9-25 14:58
    ; j$ A8 ?% R7 o能不能把这个也贴上来,看看和上一个有什么不同?
    8 @* X! x7 M- a2 C7 e3 H5 o1 z
    理了理思路,重新做了一个测试。* U. @+ x5 U- X" G7 G
    做了两个 vector 和 两个 float *, 都长 1000007 g! P9 A  ^7 ~
    外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.2 ]0 {6 C5 N, A& U# t# A! s4 h8 ?/ E" ?

    9 J  c$ X: T5 B内循环试了4种方法,
    2 d. e9 l. r5 M' |+ z6 N1. 直接调用 vector inner_product 247s + Z& o* l( k% S  [% p
    2. vector 循环点乘累加 237s
    4 k6 \6 _+ H6 p0 {5 ^: ?! B/ `3. float * 循环点乘累加 204s4 G9 B6 e4 `4 ~5 m1 K" G7 O
    4. 空循环 100000 次 202s
    : D  E9 K: ^" U* t9 i$ i0 A5 \, p. g7 P, v  `% W3 Q- p
    不做内循环 200s# y+ M# X) H9 O! l5 t

    , k: E3 @/ X/ r7 ?8 G. X3 E: [- n你昨天说的对,内循环本身占比是很小的,大头在其他处理。" ^. z. o4 r% K5 h
    另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。9 J+ x- Z/ K% w
    " ^. N( {5 s0 F
    至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
    1 i+ k. Z- [0 @9 E0 R8 t
    6 U9 s% D- L8 o5 z- R# J0 o+ c(为什么下面我贴的  b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成  jj 好了,原来 方括号里的 i 是斜体标志  LOL)
    4 W3 p7 z$ a8 z5 ]) N# I% h' C$ N. v% ^! o: E; S
            std::vector < float > vec1(N);
    ( a5 f2 z6 j* Q0 w5 p( c        std::vector < float > vec2(N);" \+ K2 H" C. \7 P; `
            float* b1 = new float[N];; E+ ~; O! H" |' T
            float* b2 = new float[N];
    + S: }" v% d# _3 _) E$ K( z  W! t" {: ^
            for (int j = 0; j < 6000; j++); H7 [+ K! |+ k0 A3 E8 A5 j
            {, o2 w/ x4 R5 p0 N. z) p
                    std::generate(vec1.begin(), vec1.end(), []() {
    ( h3 `& ^$ b9 N2 D! o$ T                        return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;8 \0 ^) s" N8 K
                            });
    / {+ h0 o$ l' ]7 A
    1 _$ q& U& }4 E                std::generate(vec2.begin(), vec2.end(), []() {
    & f8 I& U9 r% p! `3 f& ?                        return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;6 \* _4 s! e* N/ {% w% ?
                            });
    7 f$ a5 L. S2 \% F, I* _4 g$ |5 l7 }; h9 ~. a
                    for (size_t jj = 0; jj < vec1.size(); jj++)5 p$ t. B3 Z& P+ ~* s" E+ L
                    {2 ?; J4 V/ X0 ], ?& ?
                            b1[jj] = vec1[jj];; r4 z( Y, F& t. a4 N# d7 ?1 ~9 r
                    }
    % m/ K" q7 C) O0 ]9 r2 \& }/ l( H% J/ e" j1 x6 \+ w2 ?
                    for (size_t jj = 0; jj < vec2.size(); jj++)% z9 L' B' O* ]
                    {. _; R. [6 E* q' Q4 a7 ~9 P. e
                            b2[jj] = vec2[jj];
    4 {0 w/ x8 \' L! D( ~                }
    + ^: H  W6 X$ j6 Y6 w) ^: p
    4 x2 S7 q, v) M$ b                //Method - 1  N=100000 247s  
    8 j* V& n, ~% {7 e                //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);6 f' o" t: b1 k6 l3 f8 ~
                                    
    8 Q* l& T( W4 O# E- t* j2 Z: \2 N9 }$ M                //Method - 2  N=100000  237s
    4 W' v2 \  r( T+ `                /*
    & x+ d( u& U7 N, [& y8 Q3 D                for (int jj = 0; jj < N ; jj++)' ?! |1 z) {7 A7 }# a$ F# F2 h% l
                    {
    - ^5 w! e$ L: L& r; H                        fresult += vec1[jj] * vec2[jj];
    ( A+ v, w1 Z2 f2 t( {' M! m3 |                }
    6 Z, d7 U( S7 m; ~! ?2 w                */
    1 p* D$ {' e# S, s2 X7 [  ?; @4 D                                
    % r+ q; s3 I4 F$ g3 D. m  W                //Method - 3  N=100000 204s
    6 n  H  u# g, A- P                /*: X0 a% }' W6 Y" f5 I: N- X- v
                    for (int jj = 0; jj < N; jj++)/ a6 c* G7 R% J% ~! G4 F2 m: d+ ^
                    {
    9 X: ^) c  ^# @8 Q( V- P) h! u; {. N                        fresult += b1[jj] * b2[jj];
    1 K" E; ~) c8 I0 V                }- [5 _$ t5 S) I. E3 v. C  K) A
                    */5 \2 Z" `7 ~9 Y( i0 A1 i
    4 }3 D9 P+ Z/ o0 F) a
                    //Method - 4   202s
    4 Q& F! D6 d  i6 k/ ^3 A                /*
    8 K0 V  `  o1 s/ J) f* U* ^0 S                for (int jj = 0; jj < N; jj++)
    " J2 M% E  q; \- a% ?                {+ J; _! B/ H$ v
                            # G: x1 i, k0 R* z: h  z6 ^+ m; s8 H
                    }& V! q  J; C/ |; W# [
                    */' ^0 R6 Q+ d: o
                    //comment out all methods, N=100000  202s               
    5 D' i" S5 O& J# Z        }
    5 Y: U7 T% z/ s/ A3 o$ s+ ?4 [9 X! R1 J
            delete []b1;
    5 C7 h* v8 i+ b3 l6 `: |- @, i        delete []b2;
    0 _+ M8 q' F. q. s% O$ b! Y
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    16#
    发表于 2022-9-27 00:15:38 | 只看该作者
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?
    * o( G8 J3 p3 n0 E8 a% y/ Z/ L; o2 x) {% w  h
    你第二个试验里面的j在循环里面又重新定义了啊,你确定真的跑了6000次?
    - E5 y8 \- Y, D9 F. b* D; R  i; F
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    17#
     楼主| 发表于 2022-9-27 01:16:03 | 只看该作者
    机器猫 发表于 2022-9-27 00:15% I: O; }, O0 H. U9 j1 k
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?
    . _2 v3 R5 n0 e0 z3 ^2 k$ {" C% J( E5 i1 ]
    你第二个试验里面的j在循环里面又重新定义 ...

    ( z1 S5 b: a- T) ], {内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL( @3 L' z# g, d; ]5 ]3 m

    : z& _! `% X4 j- J! j1 {) i$ [不和它较劲了,瞎耽误工夫,我已经转到 ubuntu, 也准备顺便试试 avx2 向量化。
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    18#
    发表于 2022-9-27 02:06:58 | 只看该作者
    雷达 发表于 2022-9-27 01:16
    " I; \  }6 M! s4 m: r. K4 a0 G内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL
    ( p/ @2 ~! R) C1 B6 N8 t* S; x1 B8 K& p
    不和它 ...

    / E( f; ~; X" I) Z5 @
    8 M$ u& n5 Q. S+ \0 [7 k不过可以试试我说的register变量。前一个试验j是混在一堆其它变量里一起定义的,很有可能是在stack上,这样内存读写会更多,要是再碰上每次都需要加载cache就更慢了。! E; w9 m. {( A9 k  a5 \$ F
    后面一个是在循环那里定义的,说不定编译器就把它优化成register变量了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

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

    使用道具 举报

    该用户从未签到

    20#
    发表于 2022-9-27 20:29:50 | 只看该作者
    雷达 发表于 2022-9-24 23:54' A, Y) w* C5 \: V1 G
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    : v  s/ r$ r* s8 l& R$ L{2 i4 y% X8 S8 b% c5 c0 f9 Y/ e; @2 n2 d
            comp temp, xtimesy;

      U% |$ E0 k. U8 f. h这个code里面如果Openmp没有被注释掉的话,那么temp那个变量应该是定义在循环里面,否则线程之间会存在争夺写入那个temp的风险。" Y1 f5 ^8 ^. m0 F; ^$ M4 |
    内层for循环如果没有内部操作的话,编译时应该被优化掉了,和你完全注册掉整个循环是一回事。可能你的编译设置没有打开优化?
    ; Z: h! m# X5 ?6 x0 p! lVS社区版没有问题,我工作用的就是社区版,设置正常的话不会比商业版差。以前游说头头用Intel Compiler,他说不想花钱,而且差不了多少,就一直用到现在。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2025-11-24 21:30 , Processed in 0.040088 second(s), 19 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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