设为首页收藏本站

爱吱声

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

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2022-9-24 22:54:26 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
    C++ 比 Octave 慢好多,怎么破?6 R- P, v* J! y2 `* {' l' n
    9 \! N5 O( O0 B+ F' G/ E; d; A
    自相关两层循环,内层循环涉及浮点数计算,试验了一下把内层循环内部全都 comment out 只留个壳子,  但空的内层循环本身就把速度拉下来了,看来问题并不在浮点计算。" _  }: j- m0 V/ x

    / M3 t: k5 Q& h9 i; U速度优化问题真的很有意思啊。
    . `0 i0 e, S* }3 I0 `5 h$ K" t; A  e  k: S; m3 }
    欢迎大家继续讨论

    评分

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

    查看全部评分

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

    [LV.Master]无

    沙发
    发表于 2022-9-24 23:04:16 | 只看该作者
    拉下来?拉多少?" O8 j5 m" b7 [; `
    把代码贴上来看看?8 A3 T8 L/ L( Y6 f3 r5 i0 m, E
    ! k" V- K; k" @& q8 E
    难道分支预测不准破坏流水线执行?不该啊。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    板凳
    发表于 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 编辑
      e* x( @+ u; o/ }
    数值分析 发表于 2022-9-24 23:048 ~0 a; Z# i* b6 r; o' v! Q
    拉下来?拉多少?# C2 I. W* R! x4 R; [" o
    把代码贴上来看看?

    ) T" A$ L5 o9 y! \7 }) L  u7 P, H& ^6 m* N  M! j
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)$ s6 ^$ q$ d+ G7 b" H: d2 I4 u2 c) L
    {
    ( i2 x8 D% R4 e5 b4 S        comp temp, xtimesy;
    ' }# y& B# H; C7 N4 o        xtimesy.re = 0;. t) Y* C6 b  Q% m$ X8 p+ y
            xtimesy.im = 0;! `2 D! Q0 u! {6 p7 H# R5 o8 _
            int j0 = lenB - 1;
    . A( i6 b. F/ x- k3 g' B        int    i, j, i1, reali;
    $ h* N7 ]& X; E* y        if (lenA % 2 == 1)
    * H9 y) D% L5 a2 Y" A9 a3 j                reali = lenA + 1;
    $ ]- H/ A5 r. ?; m% n+ _9 K        else
    0 j$ g% P  x0 M4 i; {$ j% b0 j                reali = lenA;  j; ^4 O. p  U8 z$ n! q% c
            reali /= 2;
    " f" u( c0 N2 A* Q7 D% t' `4 [% {4 l
            int nconv = reali + lenB;' W& T& `+ X$ o. {5 ?; U4 h' O
            //#pragma omp parallel for
    ' S; O1 K# h2 d% S! g$ E5 ~        for (i = reali; i < nconv; i++)- M# i/ G2 b5 m# S
            {
    ! L5 v5 P# S; i: ^                temp.re = 0;1 L, L& o. j4 ^. O3 {$ Z  a" z' _
                    temp.im = 0;
    , G: u; {3 U: |4 m/ Y# w" Y                i1 = i;+ ]. H$ y( Y& w- D( B7 t0 n: T4 d
                    for (j = j0; j >= 0; j--)8 Y% V# L4 c( f4 e  B  G
                    {
    2 n: K7 R. q$ }                        /* floating date operation */9 E9 m4 e! m$ x7 I
                    }
    . g+ i0 l+ Q4 j2 [2 d/ M+ }5 a
            }* p9 Y6 [% X7 M# ?( S* I
    }
    8 g9 u/ @  T; Q) o1 e/ v6 [+ e6 p! l$ r
    xcorr函数代码如上,comp是复数struct, 做过长度为11、19两个矢量的测试,和octave结果完全一样
    9 |1 t: u- k% f" y2 \( @$ X
    ! W5 y* L& i( N( e' p红色部分是内循环,现在其内部操作都comment out 了, j0大概是 6000。6 y! W0 a" C" Y
    现在call xcorr 100次,耗时78s.6 m& }% N3 L6 b4 e  ]# S3 ^" H
    4 D: |- {0 |- }& \( ^& t& Y
    如果把红色部分内循环本身完全comment out, call xcorr 1000次,耗时 <1s.
    ( f- w' v7 Z! d7 {2 G
    4 }2 V+ D" a5 F  q3 ?# J
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    6#
     楼主| 发表于 2022-9-25 00:17:17 | 只看该作者
    风雨无阻 发表于 2022-9-24 23:33
    3 x) f3 \0 W7 I5 Q& y  g/ S( @8 oMaybe Debug mode?
    0 c' U( M* k3 B6 r$ b

    + D; X7 Y. }5 t& d2 D不应该,看我上面的回复。
    4 a, L2 M2 V/ o+ ~1 I! W" l  e7 A. c& ]( `, Y; W) Z9 P8 U3 M; C9 a
    我更怀疑是 VS 社区版的问题
    回复 支持 反对

    使用道具 举报

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

    [LV.Master]无

    7#
    发表于 2022-9-25 00:20:10 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 00:24 编辑
    5 _7 k3 U5 @: ^  m$ R  P
    雷达 发表于 2022-9-24 23:54  d; b4 B2 T4 p+ v
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)1 s; u7 J6 s9 Z
    {
    , d# e% _% r. B        comp temp, xtimesy;

    - U: O7 a8 B# a& B) i* E. ^2 e  l; w/ t- V* U, ?# d: B
    这个不是这么比的吧。。。/ X+ z( p0 a3 m+ D; ~0 h" [

    ; X$ S; M3 _1 o& U% b. F您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    ) y. L5 O5 Y% w  ]2 H% |( J/ z+ J+ t# m
    而加上内循环,光jmp和dec指令就至少多执行了6000个,慢个几十倍不是正常的么?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    8#
     楼主| 发表于 2022-9-25 00:46:56 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 01:09 编辑 7 z" o& n; U6 k0 E2 f' T" ]
    数值分析 发表于 2022-9-25 00:209 A8 b# ]! g9 d# o
    这个不是这么比的吧。。。3 _/ m% z0 x  q/ L; n# [6 D; B9 p% B
    ) M0 x) v  X3 l- f# Y9 ?+ B9 h
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。

    + e/ W% G+ n! t& g7 R4 |& Z; E
    , n$ f7 L+ e! B* S$ u6 [有道理。
    6 n4 ?- N/ {# a/ w4 W& A3 C所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,记得 numeric 库里有算向量内积的,我回头试试。
    ' Z" z% W$ s2 n" [! D7 H% |! ?. a) ^
    我先尝试尽量用标准库,一个小程序,不想搞得太复杂。多谢了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    9#
    发表于 2022-9-25 01:27:53 | 只看该作者
    雷达 发表于 2022-9-25 00:46! p& W' m9 {6 }( n
    有道理。
    7 U3 R$ m9 X% m1 K4 P所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,这大 ...
    9 F7 {, t2 b9 t9 }7 ~5 M4 e3 N. K  [
    你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子,把循环本身翻译成机器指令loop或dec/jnz,两者速度上会差很多
    1 A; ?* e6 V% Q( ~7 o* N# C6 ]Why is the loop instruction slow? Couldn't Intel have implemented it efficiently?
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    10#
    发表于 2022-9-25 01:48:51 | 只看该作者
    数值分析 发表于 2022-9-25 00:207 {; F" A* q$ l, ^1 r  `, [
    这个不是这么比的吧。。。* R$ I$ @; Y8 K, k% \

    ( n# M& @. U- {0 F( ^9 T0 T您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    而加上内循环,光jmp和dec指令就至少多执行了6000个

    ! V, x% H: g5 i3 j; }# t3 b8 ?3 e* @0 n- a0 W" Y$ [7 L: ^2 [
    现在的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 编辑
    ' n9 Y: q8 U9 O3 @% {# U
    沉宝 发表于 2022-9-25 01:487 ]/ r4 X! @8 t* V1 l$ d
    现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果 ...
    % W( x* w( K9 Y* V2 S! P% F. u
    + t8 O7 U. j7 ?9 `
    是的,兄台说的对。: y4 @# W3 Q$ O
    4 H8 q+ @+ W" ]$ a  ]
    其实我想说的是 真正数值计算部分和代码中其他不直接计算的overhead的比值这个事儿。
    + A( d7 k3 k1 i! y4 C! J
    + P% W( L4 J0 |% O6 W/ t雷达兄构造测试用例的时候,屏蔽掉了所有计算的部分,使得剩下的都是overhead,这样run time比较的结果就显得好像不合理了。如果把计算加回去,计算部分的run time会dominate,结果就不那么离谱了。因为不好说,所以用指令数对比的方式试图直观地说明这一点。
    5 E! ]/ a+ c$ Y  {: p0 R2 b
    " b( t- c% B( e6 U! y5 V比如说,如果有计算,那么跑六千个循环相对于计算应该用不了多少时间。但是如果一边是什么都不做,另一边是六千个循环,那六千个循环比什么都不做慢几十倍了,就不是那么不合理了。( p+ Q1 [0 l/ d$ z; l  h: u
    - m) X1 J! S$ b5 O6 V' l
    当然也有可能像兄台说的,是优化参数的问题,但我觉得更多地是测试用例设计的不合理。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    12#
     楼主| 发表于 2022-9-25 04:47:43 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 04:49 编辑
    ; x+ N& P1 o; y/ v* F# C' O. |' x
    沉宝 发表于 2022-9-25 01:277 G$ K* t1 q4 p- @0 b
    你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子 ...
      x4 P) V! F- G' h: J$ H6 n# ^+ [/ \
    . P! h6 S6 P/ L, ]/ G8 z" h9 C
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差一倍,我上面这个差的太多了。, h8 n; d: I$ `5 q7 l
    3 l3 L& S) F& G# L& i6 L+ {7 w
    我已经完全懵了。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

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

    4 {& ^: q' P$ a7 ^9 i# K时间差一倍的结果可以接受。
    7 |  [% U( {$ G8 s3 w
    ; @, W9 H3 i6 \7 Z7 o# M2 e% w6 p你还是用profile工具看看吧。现在大家都主观瞎猜。
    回复 支持 反对

    使用道具 举报

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

    [LV.Master]无

    14#
    发表于 2022-9-25 14:58:59 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 15:38 编辑 6 O6 n* `, S5 [9 B
    雷达 发表于 2022-9-25 04:47
    ! u, @9 `, o5 y又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...
    8 z- c  }+ R6 k7 ?8 @; r. P
    5 r4 B! i2 X; _9 a+ F

    / Y6 U! i( Y- z4 C, V, _% K% f/ ?$ j7 ?: l) b
    能不能把这个也贴上来,看看和上一个有什么不同?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    15#
     楼主| 发表于 2022-9-26 01:30:03 | 只看该作者
    本帖最后由 雷达 于 2022-9-27 01:17 编辑 1 o7 `. `& Q, r, Y* s, w' z
    数值分析 发表于 2022-9-25 14:58/ j: [/ \: n; x* H' d6 {3 G4 N
    能不能把这个也贴上来,看看和上一个有什么不同?

    ! b( O& z. E# u5 c理了理思路,重新做了一个测试。1 A& I6 \. N, p! }
    做了两个 vector 和 两个 float *, 都长 100000
    * ~) G+ D/ {2 z; e' G( V外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.6 k3 t* C8 m8 n  c& l" F: Z* ~
    9 ~3 J& A; W# D$ Q2 l
    内循环试了4种方法,
      \) P7 p, I* p0 ]" A  Q+ ^1. 直接调用 vector inner_product 247s
    " \' Z: J: F9 f# H2. vector 循环点乘累加 237s  p+ W( O  L; B+ y5 g( T2 q, `
    3. float * 循环点乘累加 204s
    9 p4 _0 [( j: k4. 空循环 100000 次 202s
    % u. g4 Z( D/ S# m  `: L; ~$ T5 j4 y# f
    不做内循环 200s1 Z  x2 U' o7 T  V& c1 t
    " e" m7 `2 j$ D5 C. }3 c( @
    你昨天说的对,内循环本身占比是很小的,大头在其他处理。
    2 W8 }5 l. A" ]0 C: x5 z' C另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
    . s5 x% B) i, t# f% }' N4 g# o, F# O
    至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)/ P: Q$ a8 a3 a2 G9 m% {, ?

    . E: E0 v$ z% y4 r/ u! U(为什么下面我贴的  b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成  jj 好了,原来 方括号里的 i 是斜体标志  LOL)8 S% O1 R( m0 w7 Y( r
    $ A/ A1 S% {. r. G8 ~- T: z  u6 `
            std::vector < float > vec1(N);
    3 @- a/ Z9 `3 K9 Z7 G        std::vector < float > vec2(N);. s! z, }- w5 B/ L) x9 c6 L
            float* b1 = new float[N];
    $ I+ Z" ^# V3 o( F' T0 _        float* b2 = new float[N];' r9 n6 K  h# d

    # |+ v) D0 C! c, E2 A* L7 G        for (int j = 0; j < 6000; j++)5 R0 ?0 N7 ~$ Z/ G$ ~" l) ^& D& r
            {: u/ \+ l4 T  Y7 @+ Y+ R
                    std::generate(vec1.begin(), vec1.end(), []() {9 j7 r" J5 u, L9 l
                            return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;0 n' @* J$ }. v5 f2 k. g/ E
                            });7 F9 V# ?" B, F0 [5 S' O
    " c5 y% B5 \3 H: \( v. O, r: I
                    std::generate(vec2.begin(), vec2.end(), []() {
    2 y8 z# M7 f, i* [4 M                        return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
    ; n/ B' O+ O" S: o9 z                        });6 p$ q6 c+ _* N2 Q" c& d

    5 e) [5 ?6 h$ k' ~6 Y; v+ g7 u5 N                for (size_t jj = 0; jj < vec1.size(); jj++)1 N5 T7 C, r0 J9 P! U
                    {8 o0 q2 S" @9 k9 Z6 z) E
                            b1[jj] = vec1[jj];
    / ?6 U% ~# _5 _                }/ Q/ O! Y7 k+ j+ S8 ?. l, p
    $ r! _" D: d$ a, W$ @
                    for (size_t jj = 0; jj < vec2.size(); jj++); a. t- K5 d) P
                    {
    $ g2 R8 m5 k+ Y8 r; k) H0 g                        b2[jj] = vec2[jj];& d4 v' y9 U& f* N. C
                    }
    * Q5 |# R  j0 q; X1 p: z; G$ j5 l' m
    ) a( l0 j  A! n! J) A2 \; L                //Method - 1  N=100000 247s  ( n* K' z1 {& e2 R* q$ u" p
                    //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
      U( z1 Q+ [0 ?! P- l! ?% n                                
    + Q- r; z  _2 t# G$ U7 w. q, t                //Method - 2  N=100000  237s
    0 ^* v, B2 E- V0 _8 L4 Y) L: }                /*
    8 V- c3 f: V% P( o& K                for (int jj = 0; jj < N ; jj++)
    4 r4 @4 H* v3 G+ ~& ~2 H                {
    9 _! q' C" K. ~, F                        fresult += vec1[jj] * vec2[jj];
    6 Y0 |% G9 i* i2 s                }
    $ Z/ a4 |) o6 |/ f) C! O                */1 x6 A& F; }4 k$ ~( L: \9 a
                                    
    8 f9 k# t6 [7 t2 |, n  s                //Method - 3  N=100000 204s
    2 y! O/ ]0 F0 V  K, d                /*, X5 h$ l/ Y, O2 ?# S% c+ {2 C
                    for (int jj = 0; jj < N; jj++)
    : S$ T4 N/ o% l* `; S                {) k4 V  X# i( _- j- Q1 `
                            fresult += b1[jj] * b2[jj];
    & I% `& X' `9 F$ i4 O                }1 {4 X$ W3 I2 Y: n0 E: q8 ~' W
                    */
    " D1 u/ a: j, t9 I' e* D, u
    9 I& E3 d) e; i( a* {& P8 s& M                //Method - 4   202s  m& J; `1 L9 Q- W( q
                    /*: w2 ?, {. ~8 u+ b7 C; J$ _
                    for (int jj = 0; jj < N; jj++)
    / m% z5 U9 t. K. D3 g, g3 l                {
    , W2 w# Q, m  h0 ^, O- `                        
    7 ]# x6 [' x' h+ @                }% J* D# x2 D, W6 D) B
                    */
    - Z: _/ Y" Z: T; b                //comment out all methods, N=100000  202s               
    ( ^) l0 k, x" y0 B% `9 ]0 m        }
    1 C$ I7 _( |* w, B5 N- A* t! a1 h8 S4 l3 j. W
            delete []b1;8 x8 O; f7 t0 T/ n' B3 g
            delete []b2;

      ?1 f: r& ]9 a: K7 W9 I/ v3 u* d
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    16#
    发表于 2022-9-27 00:15:38 | 只看该作者
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?
    ( I6 |3 G9 Z$ D" c! v0 h
    : i2 b4 r5 u8 W6 s) c: t+ o你第二个试验里面的j在循环里面又重新定义了啊,你确定真的跑了6000次?
    - `: v3 B  k. S4 Q7 k
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    17#
     楼主| 发表于 2022-9-27 01:16:03 | 只看该作者
    机器猫 发表于 2022-9-27 00:156 w1 d! [7 e3 I; D* a- T+ L
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?' _* o( `9 n3 I: Y  h: q

    * B5 P3 S' U' h! m你第二个试验里面的j在循环里面又重新定义 ...

    * |9 J) n3 p0 p# T& F. i4 Z7 Q内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL
    6 c: T7 i* @$ c& K7 o" g) Z! B, r9 N1 j- V) ^1 L
    不和它较劲了,瞎耽误工夫,我已经转到 ubuntu, 也准备顺便试试 avx2 向量化。
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    18#
    发表于 2022-9-27 02:06:58 | 只看该作者
    雷达 发表于 2022-9-27 01:16
    & E: _2 `) G( g/ c内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL
    0 g, a/ V6 x8 O+ t, m+ R4 K9 Y; k8 h0 [/ w4 y4 `/ @0 V
    不和它 ...

    , p$ E0 P# I- S& |3 d
    4 w! ~% u' t5 {. |" f' s8 t+ G; i不过可以试试我说的register变量。前一个试验j是混在一堆其它变量里一起定义的,很有可能是在stack上,这样内存读写会更多,要是再碰上每次都需要加载cache就更慢了。2 T* J: z% e+ w" |$ J' t
    后面一个是在循环那里定义的,说不定编译器就把它优化成register变量了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

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

    使用道具 举报

    该用户从未签到

    20#
    发表于 2022-9-27 20:29:50 | 只看该作者
    雷达 发表于 2022-9-24 23:54
    9 Q, P. r! V. k) a+ T8 ]void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    5 u) H0 Y$ }: g{+ w2 P  {* j% Y6 t- r
            comp temp, xtimesy;

    ' o) h5 y+ T' s# s- s这个code里面如果Openmp没有被注释掉的话,那么temp那个变量应该是定义在循环里面,否则线程之间会存在争夺写入那个temp的风险。
    9 `6 W( @$ X' Q/ T内层for循环如果没有内部操作的话,编译时应该被优化掉了,和你完全注册掉整个循环是一回事。可能你的编译设置没有打开优化?. ~( v0 j2 s: I7 ^0 A" h( l& C* D
    VS社区版没有问题,我工作用的就是社区版,设置正常的话不会比商业版差。以前游说头头用Intel Compiler,他说不想花钱,而且差不了多少,就一直用到现在。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2026-4-27 18:17 , Processed in 0.091423 second(s), 19 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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