设为首页收藏本站

爱吱声

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

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

[复制链接]
  • TA的每日心情
    奋斗
    2024-3-29 05:09
  • 签到天数: 1180 天

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2022-9-24 22:54:26 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
    C++ 比 Octave 慢好多,怎么破?
    0 g! {% K, D0 G" o; {# G+ u; t0 F. n" U0 _, t. F+ Z) r
    自相关两层循环,内层循环涉及浮点数计算,试验了一下把内层循环内部全都 comment out 只留个壳子,  但空的内层循环本身就把速度拉下来了,看来问题并不在浮点计算。
    9 P( X& H+ D) ~5 g( Y: S4 g, P/ ~+ r* F
    速度优化问题真的很有意思啊。
    4 x# K0 c9 F0 c2 c$ Z% L; g; e& Q
    3 e+ O' w4 w. l6 t0 H) c+ W欢迎大家继续讨论

    评分

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

    查看全部评分

  • TA的每日心情
    开心
    9 小时前
  • 签到天数: 1646 天

    [LV.Master]无

    沙发
    发表于 2022-9-24 23:04:16 | 只看该作者
    拉下来?拉多少?
    " Q/ k! f# v6 {* P4 r4 c6 \把代码贴上来看看?0 I4 G! D- a2 o3 t1 A5 O, K
    ; Q  O, z! d& ?& _
    难道分支预测不准破坏流水线执行?不该啊。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

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

    使用道具 举报

  • TA的每日心情
    开心
    2024-4-22 03:36
  • 签到天数: 120 天

    [LV.7]分神

    地板
    发表于 2022-9-24 23:33:02 | 只看该作者
    Maybe Debug mode?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2024-3-29 05:09
  • 签到天数: 1180 天

    [LV.10]大乘

    5#
     楼主| 发表于 2022-9-24 23:54:10 | 只看该作者
    本帖最后由 雷达 于 2022-9-24 23:57 编辑
    : w: w2 B. S6 T/ `
    数值分析 发表于 2022-9-24 23:04
    7 O/ s( a- y' z4 r; ~  L拉下来?拉多少?
    2 Z+ F/ U; }! i$ C* }$ [' Z/ {; D5 d把代码贴上来看看?

    * B% x, M  g7 M6 z! i  M, {% F" N0 [! a5 G$ c
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    9 }; k2 |3 Q7 _) L- C  t8 W5 [{, O9 \& `4 j7 h- b; u: T
            comp temp, xtimesy;- Q1 g0 ?* K3 \6 W2 w+ Z$ A, C2 e5 f
            xtimesy.re = 0;
    ( }; F* r( o0 f, u        xtimesy.im = 0;
    2 g, N- i5 t6 W. v        int j0 = lenB - 1;1 K: D- Y9 V" g0 h
            int    i, j, i1, reali;
    " s) [3 @+ k: i7 A! ?8 h        if (lenA % 2 == 1)
    * W) f0 C5 g6 V                reali = lenA + 1;* f0 ~' e( K2 m% \+ g
            else
    , @! X+ ?- s8 b) M$ a5 n9 c                reali = lenA;
    , u& e. H0 b$ c        reali /= 2;
    , n! |( Z% l9 F9 ~) _1 E, k$ A7 L# s6 \4 F3 o1 K4 S! t) h
            int nconv = reali + lenB;
    5 C" D/ Y! ?8 R$ m# }        //#pragma omp parallel for
    % f: w" s5 s* Y# x        for (i = reali; i < nconv; i++)
    $ m: M/ Y! A$ C  \: G+ f        {  m8 J% h, C4 K1 N4 @& P4 v
                    temp.re = 0;
    * R7 m! h1 ]  v( c. |1 e6 ?4 h                temp.im = 0;
    ' C5 M9 A$ B, L% y* E                i1 = i;
    + o4 A2 j- \  z  K0 `: M1 x4 I                for (j = j0; j >= 0; j--)
    : ]' k$ @8 S, s/ N2 y9 \                {
    9 ~# ~+ K9 B; x. f                        /* floating date operation */
    ! b4 M& t- v- U                }
    . S7 A: P/ M  K, V) s9 g+ s
            }; l+ x' i4 Q) }1 {2 f) B) t
    }( b; Y/ Z" n# `
    ; r* j5 q/ O  ^; \
    xcorr函数代码如上,comp是复数struct, 做过长度为11、19两个矢量的测试,和octave结果完全一样
    4 N* U9 `" P! q8 |" ?  ?% G
    - G3 ]+ |3 T3 k  N* C, i红色部分是内循环,现在其内部操作都comment out 了, j0大概是 6000。3 y. {  N; }- U4 V$ t
    现在call xcorr 100次,耗时78s.
    - a8 L, y# l' K' J8 F1 k1 V- e- F6 [/ e& a9 x0 U1 u
    如果把红色部分内循环本身完全comment out, call xcorr 1000次,耗时 <1s.
    ' e7 L& o$ ^4 F, K# S; Z% z" g
    5 T' n4 Y& G/ k0 ~7 z0 O  A( D8 }
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2024-3-29 05:09
  • 签到天数: 1180 天

    [LV.10]大乘

    6#
     楼主| 发表于 2022-9-25 00:17:17 | 只看该作者
    风雨无阻 发表于 2022-9-24 23:33
    1 B4 N# O) T, V- d* B3 `5 ^$ zMaybe Debug mode?
    ; L7 O6 o9 J6 Q$ n; r' B; V
    4 T7 V, l2 Z% s6 E; e
    不应该,看我上面的回复。% ?. `' s; ]# i- t9 t4 r- C- G6 A% y
    , n( @6 M: B' \9 N2 _3 h
    我更怀疑是 VS 社区版的问题
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    9 小时前
  • 签到天数: 1646 天

    [LV.Master]无

    7#
    发表于 2022-9-25 00:20:10 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 00:24 编辑 - V3 w2 \% S4 [/ \/ b
    雷达 发表于 2022-9-24 23:54
    ) m& `7 j+ l' H  F. W% |+ D# }void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    $ r# A' y$ f) U5 O- y: L{
    ) }7 N( C, h/ O+ h# |( i" k% N        comp temp, xtimesy;

    & d, n6 P3 r7 {4 ~. S; A  s  z
    4 |: `' J0 }' ^5 b  B. r这个不是这么比的吧。。。
    5 d; C# F) \6 i7 g* l- G9 o  |$ F: w
    ' D$ ?: Y; R) Y$ B% p+ w: `1 K您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    & L% H, P8 z# S: T8 d' a- u* g' ]
    . M8 d6 U) f$ N- @而加上内循环,光jmp和dec指令就至少多执行了6000个,慢个几十倍不是正常的么?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2024-3-29 05:09
  • 签到天数: 1180 天

    [LV.10]大乘

    8#
     楼主| 发表于 2022-9-25 00:46:56 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 01:09 编辑 / w) E0 ~; q5 H  z; e
    数值分析 发表于 2022-9-25 00:201 Y; Z) k0 q( a" s
    这个不是这么比的吧。。。
    8 A* f  x, u) N! }2 n; J$ E% K; A: X# b9 n4 r: d! x) c5 x! R: S
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。

    8 B  B! S2 z8 V6 `/ m; s/ u+ {, v
    & Y* i, h8 v. m有道理。
    ; L* I0 n# k9 S5 @所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,记得 numeric 库里有算向量内积的,我回头试试。
    : {7 h6 [1 r1 s: \# h6 a; t
    3 k5 \4 h. a* w! P我先尝试尽量用标准库,一个小程序,不想搞得太复杂。多谢了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    9#
    发表于 2022-9-25 01:27:53 | 只看该作者
    雷达 发表于 2022-9-25 00:46
    , z/ _2 }* v1 {: ^  I4 X有道理。
    : @2 J5 T2 `% m5 U  Y所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,这大 ...

    " V6 {4 S' U7 R你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子,把循环本身翻译成机器指令loop或dec/jnz,两者速度上会差很多: f# D4 I, D! I* G
    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, |4 N# J/ R% v. t, s: p3 }/ l
    这个不是这么比的吧。。。
    * d% L$ A" g2 k" S/ ^2 Q! k
    3 S" p, Y" W# A您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    而加上内循环,光jmp和dec指令就至少多执行了6000个

    % E2 f9 w  I3 y
    / z; i( ]5 l9 D; a现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果循环这样跑,花不了多少时间。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    9 小时前
  • 签到天数: 1646 天

    [LV.Master]无

    11#
    发表于 2022-9-25 02:06:44 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 02:16 编辑
    # K$ `! {: J4 j: r2 g) P
    沉宝 发表于 2022-9-25 01:48
    9 U1 z$ h: H" t6 h6 E现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果 ...

    1 d% ]4 p0 I* U( G9 `, {+ f/ M5 P! b% H/ d1 \( ]$ s* |
    是的,兄台说的对。
    1 T5 Y, G" P. n: a' Q  A9 @
      q' @9 B; F  k: y7 k' ~: a其实我想说的是 真正数值计算部分和代码中其他不直接计算的overhead的比值这个事儿。
      j0 i; |, D5 J+ ], E5 B$ N" g' W* V# P* a
    雷达兄构造测试用例的时候,屏蔽掉了所有计算的部分,使得剩下的都是overhead,这样run time比较的结果就显得好像不合理了。如果把计算加回去,计算部分的run time会dominate,结果就不那么离谱了。因为不好说,所以用指令数对比的方式试图直观地说明这一点。1 m4 f# @* f) \
    , t& t9 L+ z+ D& A8 }
    比如说,如果有计算,那么跑六千个循环相对于计算应该用不了多少时间。但是如果一边是什么都不做,另一边是六千个循环,那六千个循环比什么都不做慢几十倍了,就不是那么不合理了。
    : _" z  r  }4 B/ p5 T& W2 B& m0 v; j/ [6 s5 o
    当然也有可能像兄台说的,是优化参数的问题,但我觉得更多地是测试用例设计的不合理。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2024-3-29 05:09
  • 签到天数: 1180 天

    [LV.10]大乘

    12#
     楼主| 发表于 2022-9-25 04:47:43 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 04:49 编辑
    ) l/ A. T/ a! j% g& R" J4 ]
    沉宝 发表于 2022-9-25 01:27, ]) u; v. C0 {' H. x/ R9 R1 _- s8 v
    你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子 ...
    2 s% e( w% l- a$ M/ ]9 k6 i
    5 |( s- Z" P% x: d: M: w
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差一倍,我上面这个差的太多了。' l. W' J3 d' d% f' b: V

    1 T( _+ X% M/ d2 u我已经完全懵了。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    13#
    发表于 2022-9-25 05:51:23 | 只看该作者
    雷达 发表于 2022-9-25 04:47
    / _, A6 v" K% H: Q8 |) A又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...
    * n9 J" _0 e7 G9 }! S
    时间差一倍的结果可以接受。7 \  B/ `6 G' w7 I" r! ^

    ' a9 Y/ p3 I2 r  o# |你还是用profile工具看看吧。现在大家都主观瞎猜。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    9 小时前
  • 签到天数: 1646 天

    [LV.Master]无

    14#
    发表于 2022-9-25 14:58:59 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 15:38 编辑
    & `7 Z3 X. |5 |3 e- ], l9 ]) n  E
    雷达 发表于 2022-9-25 04:47  e( f3 L1 A2 v4 f4 W: n
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...

    ) a6 b& O' e/ V, S4 U! p' F3 U1 t
    + `; |4 t2 t' R1 a5 K
    # U, o' W4 t" H2 H) ]# j+ k& I! M* S+ t9 d" T( h" v  L( E
    能不能把这个也贴上来,看看和上一个有什么不同?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2024-3-29 05:09
  • 签到天数: 1180 天

    [LV.10]大乘

    15#
     楼主| 发表于 2022-9-26 01:30:03 | 只看该作者
    本帖最后由 雷达 于 2022-9-27 01:17 编辑 9 P; Z1 Z& k  h; p0 e
    数值分析 发表于 2022-9-25 14:58
    1 `3 Q8 |9 A' t, w' b0 z9 g能不能把这个也贴上来,看看和上一个有什么不同?

    ( N- {+ \( ]3 F  h# J0 r3 u# f理了理思路,重新做了一个测试。/ |& Y0 |* d% G/ _+ ~2 j% b5 Q+ }
    做了两个 vector 和 两个 float *, 都长 100000
    % j% s/ {. c6 o7 i0 S# ?外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.$ _6 F0 a- Q& T) R
    9 y) G/ u# H" W7 j+ N# @/ t
    内循环试了4种方法,
    ! u7 v. I) }3 w2 W1. 直接调用 vector inner_product 247s
    5 W+ Q0 m- W' q6 i9 Z2. vector 循环点乘累加 237s; }. d6 F6 A, N0 Z6 |* c
    3. float * 循环点乘累加 204s0 P5 c0 a% X& B7 T6 v9 s0 B8 C, o  h
    4. 空循环 100000 次 202s
    ) k$ K0 O* V3 E
    - R5 b, E& R2 ?不做内循环 200s. x" c( C" b+ C( m# w5 ?
    9 G! J5 ]# F/ b- t) U: K, r: q& D
    你昨天说的对,内循环本身占比是很小的,大头在其他处理。
    - c8 x7 C& X9 u) Q2 T另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。: O; Z! W5 J1 N) u2 a
    . p/ E$ P; n( V' b+ x
    至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
    " B2 |- o( r/ q6 R7 @
    4 i) W" Z& W8 f' `3 U) e(为什么下面我贴的  b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成  jj 好了,原来 方括号里的 i 是斜体标志  LOL); Q- o1 L4 I1 U8 v/ c4 k0 x; {9 G% E& K
    ' a9 z1 y, R$ ]. }1 s" N7 |
            std::vector < float > vec1(N);9 M5 i5 C( `( s8 d
            std::vector < float > vec2(N);
    4 `1 R1 S1 \- [' x        float* b1 = new float[N];
    - U+ q$ r$ G& d  ?' o        float* b2 = new float[N];
    / G0 ^4 E1 h& I7 Z# Z
    . \! W  b5 b: c' ~" E! o        for (int j = 0; j < 6000; j++)
      ?( d4 Q* c4 \2 {$ b8 j        {
    ) O* l3 z) H7 o7 ~; C/ C# E                std::generate(vec1.begin(), vec1.end(), []() {$ [1 _: q$ d! @) D: D+ ]
                            return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
    , a% Y# Q" D( p( a                        });3 [. U% g1 p( \6 p% K& b

    ; L% w9 W8 |* ?7 G7 s' \                std::generate(vec2.begin(), vec2.end(), []() {* v5 F& R& ~$ ^
                            return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
    9 W% E  L! c! z0 U$ ]! G                        });
    ! F4 y& }3 C1 x0 h2 |3 G+ {( Z  C0 s+ m4 u* L
                    for (size_t jj = 0; jj < vec1.size(); jj++). f5 ~$ ]) U( r$ C$ I0 N
                    {, q/ b! @4 ^8 }  e5 ?
                            b1[jj] = vec1[jj];
    8 H* ?8 @1 c2 D+ H, T) h                }5 J# `: i7 j2 H2 P
    3 {1 o; e  I; f; r7 v" c5 ]! b
                    for (size_t jj = 0; jj < vec2.size(); jj++)
    ) P) ^/ ^- n- ~                {
    7 Q! U2 w0 @+ H0 \: p# v+ V                        b2[jj] = vec2[jj];
    2 V% L9 U5 e; ]  u3 ?                }  W: p$ O0 e9 \
    0 w$ \0 k, B# ?! w. w) U; ]" r
                    //Method - 1  N=100000 247s  
      T- o' B" t5 N( E+ ~                //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
    4 k8 T) p4 U3 z                                
    6 M+ T, ?5 M5 R5 r$ L3 D, i0 Q                //Method - 2  N=100000  237s& s2 V6 i# U: p1 n! [$ Y* D  w
                    /*" m3 V" R% d! M9 S; u# w4 B4 Z7 g: d
                    for (int jj = 0; jj < N ; jj++); h/ y2 c) d3 X3 b) {3 f3 d* _
                    {
    ; F5 c, H! G/ l% K                        fresult += vec1[jj] * vec2[jj];
    ( ?* [( ^# t/ v0 m9 }$ |0 J                }: Q+ G  e+ `  `# C/ O: O) O
                    */+ }9 h' Z9 h- C5 a( `' Q
                                    
    6 z- n* E1 x2 t5 i0 I9 `% F                //Method - 3  N=100000 204s
    , O" S$ {0 D6 p  r, j) c# y6 W                /*
    / O( ]3 h7 Z  Q* H/ E1 H                for (int jj = 0; jj < N; jj++)
    $ J8 w! z; I( H0 U# w) U                {8 i/ N% D; \/ [$ {# N6 g* q
                            fresult += b1[jj] * b2[jj];
    . e' o7 Q+ u0 @" Y# V                }% C0 f3 R  [# M$ |& `: k
                    */
    3 c- k5 ]# t/ `* N3 s' D# p* f4 L
    6 K! n% J% k/ s1 z                //Method - 4   202s
    / ]. Q* R$ `0 s1 L                /*
    3 e7 q; h# D; i9 A                for (int jj = 0; jj < N; jj++)
      ^. Q0 i- t* n- w; o. p: G+ W                {
    1 k8 c  Y7 L) y2 q                        
    # }9 M- M, s1 R( c' q' c; m                }
    0 X& A0 I3 S3 e8 K/ ]: v: l6 R! \                *// ?# j, l! [! r
                    //comment out all methods, N=100000  202s               
    " \6 W& x- [( t' f% G        }
    ) R- q1 W5 b* W8 A; C: H: d) U7 O, t; j
            delete []b1;3 K# j, P2 b& n8 u1 v2 D- @- ?
            delete []b2;
    * ~. y, H; Z+ j1 Q1 a, P/ G. M* V1 n
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    16#
    发表于 2022-9-27 00:15:38 | 只看该作者
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?
    9 g. ~, x6 t8 o  n9 D2 Y
    4 w" T8 L/ T9 R3 Q3 x; w你第二个试验里面的j在循环里面又重新定义了啊,你确定真的跑了6000次?
    8 @& S# n* U% s& |) m
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2024-3-29 05:09
  • 签到天数: 1180 天

    [LV.10]大乘

    17#
     楼主| 发表于 2022-9-27 01:16:03 | 只看该作者
    机器猫 发表于 2022-9-27 00:158 ~7 y4 t* N' R% b
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?
    0 h8 D4 E  D0 o9 T* n) S6 ?  v' m4 x8 O9 L! z! {
    你第二个试验里面的j在循环里面又重新定义 ...

    ! H8 h; y  M6 X5 p  p7 B8 `内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL
    ; w1 r/ t# n( a1 k2 A7 ~; s' G
    + M, k- h- y) G7 W" x不和它较劲了,瞎耽误工夫,我已经转到 ubuntu, 也准备顺便试试 avx2 向量化。
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    18#
    发表于 2022-9-27 02:06:58 | 只看该作者
    雷达 发表于 2022-9-27 01:16
    " c" F6 o+ P3 I1 T, P$ e$ x内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL
    ; ~# i# q  ]  u' X
    8 y7 {6 h4 W( [( ]# z不和它 ...
    - \( _" q7 P/ _+ F3 j
    2 z5 k; Q$ b7 U% K0 Y! ?. J
    不过可以试试我说的register变量。前一个试验j是混在一堆其它变量里一起定义的,很有可能是在stack上,这样内存读写会更多,要是再碰上每次都需要加载cache就更慢了。
    ! r$ r& ?# |* W后面一个是在循环那里定义的,说不定编译器就把它优化成register变量了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

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

    使用道具 举报

    该用户从未签到

    20#
    发表于 2022-9-27 20:29:50 | 只看该作者
    雷达 发表于 2022-9-24 23:54
    ( b/ o  x# F+ F2 Z7 }void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    4 m0 ~8 F1 ^$ O$ _5 t- U{4 w' b& G9 \$ r$ j1 b% p% O/ H1 r
            comp temp, xtimesy;
    ' y' W# w1 B1 M* Z
    这个code里面如果Openmp没有被注释掉的话,那么temp那个变量应该是定义在循环里面,否则线程之间会存在争夺写入那个temp的风险。0 ?5 y/ ^! U( Q5 b5 c% Z1 ~
    内层for循环如果没有内部操作的话,编译时应该被优化掉了,和你完全注册掉整个循环是一回事。可能你的编译设置没有打开优化?% j# Q* A1 b# h
    VS社区版没有问题,我工作用的就是社区版,设置正常的话不会比商业版差。以前游说头头用Intel Compiler,他说不想花钱,而且差不了多少,就一直用到现在。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2024-5-4 17:07 , Processed in 0.045660 second(s), 19 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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