设为首页收藏本站

爱吱声

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

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2022-9-24 22:54:26 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
    C++ 比 Octave 慢好多,怎么破?
      Y8 b1 R8 G7 O+ H
    # V" G9 l& P: P7 R5 ^# Z自相关两层循环,内层循环涉及浮点数计算,试验了一下把内层循环内部全都 comment out 只留个壳子,  但空的内层循环本身就把速度拉下来了,看来问题并不在浮点计算。6 B0 ^& L6 V' h* u

    8 y; T7 D1 w4 N3 P1 _. [速度优化问题真的很有意思啊。
    ! |# I6 F$ ^* U# }4 S; P0 ]9 O& G& v' Q  v+ u" B9 `, _
    欢迎大家继续讨论

    评分

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

    查看全部评分

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

    [LV.Master]无

    沙发
    发表于 2022-9-24 23:04:16 | 只看该作者
    拉下来?拉多少?
    ! m5 E8 W9 k# x  d2 }, `把代码贴上来看看?
    ( ^  K  b5 @# v) K7 J7 ^
    4 ^* t3 _3 L6 |9 ?& o难道分支预测不准破坏流水线执行?不该啊。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    板凳
    发表于 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 编辑 2 O, j$ ^: }5 D3 A# n; e/ s, q3 V
    数值分析 发表于 2022-9-24 23:044 o  t$ b# s8 E2 Q& f+ t. @- R
    拉下来?拉多少?( k/ {; b  `& s  `
    把代码贴上来看看?
    ; ~; x. J6 |# k5 D1 D% a4 K: E

    % b2 S3 V: q  I) w' m! q8 kvoid xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    : z" r$ }. z; _# C% J0 L! G) D{. L  o( h% H( W) ^+ u- ]7 O; e
            comp temp, xtimesy;2 s, G  ]/ S1 A
            xtimesy.re = 0;
    * \) ~$ w8 m5 s2 E& l        xtimesy.im = 0;
    7 D4 L& g1 E  I1 r        int j0 = lenB - 1;% m' ~  x( v) J6 k0 Q$ Y
            int    i, j, i1, reali;* f2 V$ X( F* T* U. o; j, n  q* R
            if (lenA % 2 == 1)+ P9 W8 @- l" `# F, Y# Y' n
                    reali = lenA + 1;8 ^2 s# ~6 ~4 e0 j+ X: f7 I' \
            else
    0 K! \4 L5 o& U& e                reali = lenA;+ _1 c9 @1 M3 h. R! \) }! d
            reali /= 2;
    : W5 {; o8 O( |7 X* b. V( a. w- O$ c
    1 W; n, I' I: Q, Y/ L3 J" |) u* k        int nconv = reali + lenB;6 b2 ^& Z5 h3 k: J2 x0 s. D
            //#pragma omp parallel for
    3 r) o# _; v( I! O0 G% m9 {) p( ?8 x5 m        for (i = reali; i < nconv; i++)
    % o! U- y. z; |. Z        {
    " B) ?8 m1 K" S  I7 V' S                temp.re = 0;
    6 l6 i, x& i# D: |% l' M                temp.im = 0;
    # n8 S& u& k9 Q+ t7 {9 S  _2 \; k                i1 = i;, z4 ]% Z0 K  _3 @/ F; {
                    for (j = j0; j >= 0; j--)4 y* a8 N; u) V6 ]. P. A6 L
                    {- M. ^8 m# v5 S! C) Y' T
                            /* floating date operation */' Z! \1 n9 X2 B" d, A
                    }

    * A  V) t2 W# {$ }        }
    & }9 w7 _3 Z$ U: B$ M}
    ' W/ \1 ?- y: Q/ `% l$ l( k4 v. y
    xcorr函数代码如上,comp是复数struct, 做过长度为11、19两个矢量的测试,和octave结果完全一样. G; l9 g5 O6 g, [% [

    & J5 U4 B& K. W$ i8 r$ P7 w1 B红色部分是内循环,现在其内部操作都comment out 了, j0大概是 6000。
    # o, ], c: z- a; |( ^" ~2 b现在call xcorr 100次,耗时78s.
    , F0 T" `3 _% u, f6 Y4 z8 }! b3 ]. B. u/ f* f
    如果把红色部分内循环本身完全comment out, call xcorr 1000次,耗时 <1s. 4 b$ ?8 P' R& j  i; Q

    7 f! u) X5 H& [
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    6#
     楼主| 发表于 2022-9-25 00:17:17 | 只看该作者
    风雨无阻 发表于 2022-9-24 23:33
      M% Y6 h& {+ \& t1 w7 e4 N! lMaybe Debug mode?
    ; N0 \6 p6 \. ~2 @; Y* K. e
    3 d& j/ N- v' l  m; t- U- Q
    不应该,看我上面的回复。
    / Y0 c8 i4 `$ E; M: p. Q+ n
    9 F2 L: R7 Q2 ?* a0 U$ r# A我更怀疑是 VS 社区版的问题
    回复 支持 反对

    使用道具 举报

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

    [LV.Master]无

    7#
    发表于 2022-9-25 00:20:10 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 00:24 编辑
    + V2 _/ P5 `1 }3 j' O* m" T& n
    雷达 发表于 2022-9-24 23:54/ s& W" f: o6 N8 c
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB). ~- \' D& A/ r6 i! E# g5 X  _* V- l
    {
    ; T* S! e7 P2 A- b5 o' a. J, Q        comp temp, xtimesy;

    5 Q, H$ E& v7 m) q( {7 k$ P4 C9 b1 ]2 O/ I9 {5 G
    这个不是这么比的吧。。。
    6 K  c  i+ ~4 I0 L% y
    $ w, c; s7 h: H) b您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。5 Q2 z7 f, f9 M$ j

    - R: Y7 b9 y1 X. x1 U/ j而加上内循环,光jmp和dec指令就至少多执行了6000个,慢个几十倍不是正常的么?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    8#
     楼主| 发表于 2022-9-25 00:46:56 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 01:09 编辑
    ; e" W  V0 m# K5 U" V
    数值分析 发表于 2022-9-25 00:20! L+ D$ b# z3 d/ a( L
    这个不是这么比的吧。。。
    ' @- X, P5 U4 a7 y- ^1 m: N. a9 E
    - l' I1 R" p. H8 C- D6 @您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    6 @# S* F9 v$ u5 |5 ^9 Z
    1 k* l( K6 x7 ^2 L$ S
    有道理。1 j( ~7 h8 k' {! W/ X0 m6 n
    所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,记得 numeric 库里有算向量内积的,我回头试试。  D( C- m& A! b* E
    # j6 O9 }, m; H. |2 J
    我先尝试尽量用标准库,一个小程序,不想搞得太复杂。多谢了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    9#
    发表于 2022-9-25 01:27:53 | 只看该作者
    雷达 发表于 2022-9-25 00:465 u- x0 Z/ B3 |" x5 p
    有道理。
      M$ `0 z" q0 N所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,这大 ...
    ) Z  M, b. D% Y5 w9 G: z9 }
    你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子,把循环本身翻译成机器指令loop或dec/jnz,两者速度上会差很多
    " z  ]2 X. I) S0 A) VWhy is the loop instruction slow? Couldn't Intel have implemented it efficiently?
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    10#
    发表于 2022-9-25 01:48:51 | 只看该作者
    数值分析 发表于 2022-9-25 00:20. o4 K5 s+ j' Y+ X- l$ z7 U
    这个不是这么比的吧。。。3 Q4 s" J5 \1 o$ f) R% R
    1 i& U) b% o0 e8 K' J7 t  D
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    而加上内循环,光jmp和dec指令就至少多执行了6000个
    + }( T# W2 T( b  z
    % @5 \$ x* V! G% L
    现在的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 编辑
    3 V4 S  I' a- w' `) c% Y. W
    沉宝 发表于 2022-9-25 01:48
    8 z0 A$ A+ D1 U现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果 ...

    ; |& C( O' h3 W. y' _, n) c$ c1 {% C# g* Q/ ~0 c
    是的,兄台说的对。
    , |* F8 i/ }2 Y+ A7 o6 x+ q( B- _9 Y, Q! Z8 ^
    其实我想说的是 真正数值计算部分和代码中其他不直接计算的overhead的比值这个事儿。
    ( A: z( n4 c' R8 x9 ?" U$ D, h( n
    ( |' l! s3 _( O9 p$ t" i6 W7 i9 a雷达兄构造测试用例的时候,屏蔽掉了所有计算的部分,使得剩下的都是overhead,这样run time比较的结果就显得好像不合理了。如果把计算加回去,计算部分的run time会dominate,结果就不那么离谱了。因为不好说,所以用指令数对比的方式试图直观地说明这一点。
    8 ^( t; A" T7 {
    2 S; y" w/ g  u" t0 @. B4 K比如说,如果有计算,那么跑六千个循环相对于计算应该用不了多少时间。但是如果一边是什么都不做,另一边是六千个循环,那六千个循环比什么都不做慢几十倍了,就不是那么不合理了。- n5 j  `7 {  ]7 }6 R; ^5 s3 ]
    % N* M. M0 z  A
    当然也有可能像兄台说的,是优化参数的问题,但我觉得更多地是测试用例设计的不合理。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    12#
     楼主| 发表于 2022-9-25 04:47:43 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 04:49 编辑   p7 e* l, |8 Y# i
    沉宝 发表于 2022-9-25 01:27
    4 L" v* s. ~3 s( R, ^1 Z3 a/ o+ y你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子 ...

    ; n5 @7 {% t2 r# r1 d0 f
    3 [, y" ~# r+ P# p4 {  R又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差一倍,我上面这个差的太多了。5 y5 Z' |# U' R3 m0 A9 ^

    , n3 P, D9 h2 ^+ x我已经完全懵了。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    13#
    发表于 2022-9-25 05:51:23 | 只看该作者
    雷达 发表于 2022-9-25 04:47
    . ?" S) b/ S( x$ a, \4 t又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...
    ) n, r* J4 Y% y3 C
    时间差一倍的结果可以接受。
    # T& V" P+ K. l$ V7 i$ K0 o7 w0 r4 T# r& p
    你还是用profile工具看看吧。现在大家都主观瞎猜。
    回复 支持 反对

    使用道具 举报

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

    [LV.Master]无

    14#
    发表于 2022-9-25 14:58:59 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 15:38 编辑 9 J' O- ?. K$ W# {1 D; y
    雷达 发表于 2022-9-25 04:47
    ! r* C: i% P) n; z  E又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...
    . z, D0 f+ R2 J4 }4 W
    # y) Q( k5 p% ?+ p* i3 _
    5 t9 D5 k- h8 o2 Y% o( h

    # V- U4 J) @. m% `" f! z能不能把这个也贴上来,看看和上一个有什么不同?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    15#
     楼主| 发表于 2022-9-26 01:30:03 | 只看该作者
    本帖最后由 雷达 于 2022-9-27 01:17 编辑 - J0 f& J) T+ [2 R
    数值分析 发表于 2022-9-25 14:58
    2 r* _4 z/ e! l( [) k7 j能不能把这个也贴上来,看看和上一个有什么不同?
    ; L) A1 S9 Y4 H
    理了理思路,重新做了一个测试。2 b0 U, ?9 w9 l( d/ f" f# a8 D+ r
    做了两个 vector 和 两个 float *, 都长 100000
    3 \/ f" J4 _- t/ q; a7 _8 L0 g7 n外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache., B! f1 Q  l5 C8 |+ p
    " H' W+ ]7 ]4 f4 \1 Q* p* n, m+ e
    内循环试了4种方法,
    ) B- B5 {. M) c+ v, G: f$ t* B1. 直接调用 vector inner_product 247s ; H5 p! s$ D+ U* j4 Z$ m
    2. vector 循环点乘累加 237s
    ' Z, E9 z$ U) S* x8 E. j/ X3. float * 循环点乘累加 204s& @& a3 ?2 C" y# c* O$ [
    4. 空循环 100000 次 202s
    ) s5 L/ Y$ {; W9 w8 s% I  N1 b$ B( c' v+ W  t& i: x& j" t" F. B2 R
    不做内循环 200s
    $ @4 ?. {" y$ S5 U) F# w" a' V: h! e% l$ |6 J
    你昨天说的对,内循环本身占比是很小的,大头在其他处理。7 [8 c4 i  z" \$ c1 q8 l8 s& i
    另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
    & S- G; E5 z; j3 d8 o6 a" e( P7 i5 C  x" ^
    至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
    , i+ u" ~9 w4 k4 ?$ t: w, j; V
    - D4 x0 c  ~! K7 m7 C  O(为什么下面我贴的  b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成  jj 好了,原来 方括号里的 i 是斜体标志  LOL)
    1 Z2 n8 Y& @3 D$ G+ i( e, A( x( F  Q7 D( j
            std::vector < float > vec1(N);+ R1 C7 r# v2 S: u" W
            std::vector < float > vec2(N);
    / q6 _' n1 s5 \/ m: n. E! _1 D        float* b1 = new float[N];
    % R# v% n4 o; h% a        float* b2 = new float[N];
    ! d  O, Q5 p& w3 c
    ; ?1 K$ _$ o2 _* e. W& X' h        for (int j = 0; j < 6000; j++)/ t- ~) }' ^- E! h: @
            {
    6 y/ r: r- S+ H2 N8 b                std::generate(vec1.begin(), vec1.end(), []() {
    4 b3 [! p# h! H8 x# V6 R                        return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
    1 |, p7 u; s; z0 E$ x% W                        });8 k  j" H5 d* O
    & x" J' x$ E& U. g' s6 Y
                    std::generate(vec2.begin(), vec2.end(), []() {
      h6 r- Q% i% ]# |1 n) h                        return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
    ; ~. w1 t- c! b0 g- y4 @  T                        });
    4 D" S, L+ Y4 E) g: ]8 B2 P
    1 d3 b, s3 \& {1 ]/ u                for (size_t jj = 0; jj < vec1.size(); jj++). D& W6 ]# ]# \$ a6 }7 r. q( }% ]
                    {
    # x* S( g% S2 w0 u/ L( s; L! `                        b1[jj] = vec1[jj];
    0 L1 H! C( s/ y$ b. {' l( C                }
    6 _" H; i- ]; k3 A3 g* J: H! i% e! @* l; M5 v; I5 D
                    for (size_t jj = 0; jj < vec2.size(); jj++)* A" E, F: \- A. n' I& }% h' j8 o
                    {
    + w0 g+ h1 t. a                        b2[jj] = vec2[jj];. o1 ?7 B/ u/ k, |  Y+ \
                    }
    & n3 z7 P* j  p' l
    % h$ r  J4 D+ v3 u* U& m, c8 F                //Method - 1  N=100000 247s  ' R; U. w7 Q0 t6 B+ Y) L8 r
                    //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);' {' {, i$ s9 O/ G  u, f  ?; a
                                    
    ; @& O/ n0 b' \! g                //Method - 2  N=100000  237s) C. @8 j3 ?; ^- ~
                    /*7 B" m8 ~; |& G0 [8 }" f6 J
                    for (int jj = 0; jj < N ; jj++)6 C9 {2 c8 |7 G) }1 q4 i$ `
                    {7 R$ z  Y, I2 u, o% z
                            fresult += vec1[jj] * vec2[jj];
    8 B1 E9 A, s) Q. {) F9 @2 C                }
    6 @( L' u  |& ?1 Y8 T' g                */  o" J, J( A7 R6 q' {6 e
                                    ) j) C* L. ~" a0 X9 f8 A: I
                    //Method - 3  N=100000 204s
    - Y: y) {/ k" V0 z4 V( [& R                /*! z# }9 O! u, j! H7 R+ G. O
                    for (int jj = 0; jj < N; jj++)
    3 K- L1 u2 `- _5 }4 \                {
    . V" F8 s' B; G# K                        fresult += b1[jj] * b2[jj];
    . Y* @( _2 _( Y7 D                }: @9 x9 H) o/ R
                    */
    5 k' [9 d/ X  b$ q
    - d. M7 N/ F& E* n- y                //Method - 4   202s3 f1 U8 b4 ~6 Z+ c/ v0 c1 j9 y2 `
                    /*' r3 J4 m5 {  q& x# x$ C# a/ J% @
                    for (int jj = 0; jj < N; jj++)) W) ?1 L+ e( K2 o: ^
                    {
    $ u" u0 E9 a8 w; i" \. z( l& A. q                        
    3 I1 {5 i6 c9 o/ Y/ \+ Z% L6 Y                }
    ; u6 c" z, C) w: h$ B4 m                */" D0 z, O8 ]5 S1 A
                    //comment out all methods, N=100000  202s               
    9 t, G# s* M% P8 [+ l3 j- c% J        }
      o7 U' r/ F. U1 @& n/ L( k8 l5 D" \3 S+ W/ H9 Q
            delete []b1;
    ( ?. O9 B  u$ u! n" u        delete []b2;

    & h' w8 x: [% q  g4 {' X( l2 }
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    16#
    发表于 2022-9-27 00:15:38 | 只看该作者
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?
    , \# O+ i' s  v: D' [: d0 S. ?8 U
    7 B8 m; {+ i( K( k+ o5 G你第二个试验里面的j在循环里面又重新定义了啊,你确定真的跑了6000次?" Y" l% p0 A" J# K. M
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    17#
     楼主| 发表于 2022-9-27 01:16:03 | 只看该作者
    机器猫 发表于 2022-9-27 00:15( _; h( B# T" w( F8 N$ b8 o" Y
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?3 h: l/ m7 @7 l) q/ u4 Y; U% \' \

    0 R+ e( y+ d, n  b( R1 q& V: |6 ~你第二个试验里面的j在循环里面又重新定义 ...
    0 \3 P$ c; w' z, C3 S
    内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL3 P& }2 A' j6 _/ k( w2 W- ]5 S! ]

    6 v# k" _: a9 O: u4 K4 l不和它较劲了,瞎耽误工夫,我已经转到 ubuntu, 也准备顺便试试 avx2 向量化。
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    18#
    发表于 2022-9-27 02:06:58 | 只看该作者
    雷达 发表于 2022-9-27 01:16: }/ p* p; V2 k
    内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL
    7 [5 q; h% m1 s1 e, q5 v2 }- K2 G% @3 l& }  m
    不和它 ...

    8 L8 j& L" I: @: e5 g. B1 ^
    ; I: a8 a! `: }: b" _不过可以试试我说的register变量。前一个试验j是混在一堆其它变量里一起定义的,很有可能是在stack上,这样内存读写会更多,要是再碰上每次都需要加载cache就更慢了。
    5 T- S- f: `6 A1 m2 r, E: O6 t后面一个是在循环那里定义的,说不定编译器就把它优化成register变量了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

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

    使用道具 举报

    该用户从未签到

    20#
    发表于 2022-9-27 20:29:50 | 只看该作者
    雷达 发表于 2022-9-24 23:54, T  a) }9 o# _% K# H
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    1 q; D% u; u; A7 L' ?) {1 j. }{
    * G. U- L6 T* n( x4 |% n# K. l        comp temp, xtimesy;

    * i- V; U' r1 p1 a  [! ^这个code里面如果Openmp没有被注释掉的话,那么temp那个变量应该是定义在循环里面,否则线程之间会存在争夺写入那个temp的风险。
    7 n. N# ^3 @7 |# T: V) `! i5 K内层for循环如果没有内部操作的话,编译时应该被优化掉了,和你完全注册掉整个循环是一回事。可能你的编译设置没有打开优化?
    0 s3 E' t# W) }6 o9 ]# \- d# Z1 O7 `VS社区版没有问题,我工作用的就是社区版,设置正常的话不会比商业版差。以前游说头头用Intel Compiler,他说不想花钱,而且差不了多少,就一直用到现在。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2026-5-15 03:31 , Processed in 0.070624 second(s), 19 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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