设为首页收藏本站

爱吱声

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

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

[复制链接]
  • TA的每日心情
    擦汗
    2024-12-25 23:22
  • 签到天数: 1182 天

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2022-9-24 22:54:26 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
    C++ 比 Octave 慢好多,怎么破?
    . Z( C3 }/ X( f' k1 t. x4 U8 c. ^5 @' i& i* x
    自相关两层循环,内层循环涉及浮点数计算,试验了一下把内层循环内部全都 comment out 只留个壳子,  但空的内层循环本身就把速度拉下来了,看来问题并不在浮点计算。  m5 n( P' V: y" e* ^+ F( A

    1 o' X- f+ M, h6 A2 f! b1 S速度优化问题真的很有意思啊。7 ~, a( U" ?) P
    + w0 c0 N  B5 E' u% |9 T! U# g7 y2 E
    欢迎大家继续讨论

    评分

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

    查看全部评分

  • TA的每日心情
    开心
    昨天 06:02
  • 签到天数: 1924 天

    [LV.Master]无

    沙发
    发表于 2022-9-24 23:04:16 | 只看该作者
    拉下来?拉多少?* |% |0 Q% h9 |" |$ K
    把代码贴上来看看?
    2 M0 H! J' r) E# q
    + N) }0 S( K% |2 z7 M难道分支预测不准破坏流水线执行?不该啊。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    板凳
    发表于 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的每日心情
    擦汗
    2024-12-25 23:22
  • 签到天数: 1182 天

    [LV.10]大乘

    5#
     楼主| 发表于 2022-9-24 23:54:10 | 只看该作者
    本帖最后由 雷达 于 2022-9-24 23:57 编辑 2 n- k0 P5 J" W( @* o+ F, O
    数值分析 发表于 2022-9-24 23:04% ?1 i$ \/ q" ?& N: G' u% k- X
    拉下来?拉多少?
    2 b% M1 j$ c7 G  n" T5 f把代码贴上来看看?
    , ^/ ?7 s# ]3 ?( l' `. x+ X( n
    ( i2 D( |( O4 |* h; d  f' K# K
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    " e) c7 |& C3 @7 ?4 x% N{
    0 R! ^$ s( |' m& N- _9 k        comp temp, xtimesy;$ V# G+ {% D6 p& {& e
            xtimesy.re = 0;  Q4 j6 x7 r/ O
            xtimesy.im = 0;1 T8 y8 P  ]- S  w
            int j0 = lenB - 1;
    & G; G/ N* [! Y" t" w6 f' q        int    i, j, i1, reali;
    , m$ w- y/ }4 W8 ^' d  V* i* e; i        if (lenA % 2 == 1)* g; R4 Q8 T" Y+ M
                    reali = lenA + 1;# R: J( B3 z. b
            else" c% Y, C! X( g$ p7 j! p
                    reali = lenA;$ T. Q+ N  e6 b8 N$ w. j
            reali /= 2;
    # p: F- ^+ T+ Z. x# ~  c
    % u% v/ R0 _) d: E, N2 t        int nconv = reali + lenB;  @' O$ p7 N; u5 y- b: }
            //#pragma omp parallel for
    2 S; s* _( G3 t) r. E$ F) J* s" Z        for (i = reali; i < nconv; i++)1 \2 j$ n. ^5 h, Y$ @! ~7 [
            {8 n$ Y8 m& t# G3 q5 l
                    temp.re = 0;" _, z0 R' u) _+ h+ r' |+ e
                    temp.im = 0;
    2 k2 i' A3 D1 y# p" d+ I* G# E  l- j                i1 = i;" z# e7 l1 D4 N! \2 G8 ]( D
                    for (j = j0; j >= 0; j--)
    % L7 Y1 g! l3 A" a4 B& E2 [                {. S; M; W; J% K0 S6 v
                            /* floating date operation */7 H& B9 N. ]0 a: j7 B; E1 M0 o
                    }
    & X" O. b/ W* P8 u; q
            }8 a2 h0 H& p! h4 Y' C4 W2 }  u: N
    }
    ; {# {3 p4 \1 N( D$ p: H
    ) M' w/ \. @. R8 T  Q: Z2 x3 Ixcorr函数代码如上,comp是复数struct, 做过长度为11、19两个矢量的测试,和octave结果完全一样
    % x! T  t* l) U. |$ p, Y6 q/ T( H" g6 o4 g6 p6 @+ c
    红色部分是内循环,现在其内部操作都comment out 了, j0大概是 6000。$ k6 l& z+ K/ `. ]% W: C$ f+ A5 S
    现在call xcorr 100次,耗时78s.
    7 ?1 u' e' @" z* R4 p( ]4 d+ O' V! \5 |0 O: m+ {4 f. Q: B. v" l
    如果把红色部分内循环本身完全comment out, call xcorr 1000次,耗时 <1s. % h. V( d1 P" J  e. T$ j

    8 a5 v" a, f" X) z
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    擦汗
    2024-12-25 23:22
  • 签到天数: 1182 天

    [LV.10]大乘

    6#
     楼主| 发表于 2022-9-25 00:17:17 | 只看该作者
    风雨无阻 发表于 2022-9-24 23:33+ L/ x; r3 C: U* e, ^& |
    Maybe Debug mode?
    + x. ?8 y4 r, U$ q. E5 |
    6 ]4 B+ K6 `( d. ~8 f; }: u8 d  v
    不应该,看我上面的回复。4 \" {) G6 _' q$ [* k) L% W! l

    . [; L4 W: q6 t& w! [我更怀疑是 VS 社区版的问题
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    昨天 06:02
  • 签到天数: 1924 天

    [LV.Master]无

    7#
    发表于 2022-9-25 00:20:10 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 00:24 编辑 # a9 L) I0 l% \( `
    雷达 发表于 2022-9-24 23:54
    * b: ^5 _8 A# h7 zvoid xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB): N% Z- h2 z* I) h. y
    {
    9 j- ^0 K7 i4 U4 @* Q0 x1 W        comp temp, xtimesy;
    3 C5 Q# m0 Z6 r: o0 \
    5 c' ?$ g9 t- q! ?+ t
    这个不是这么比的吧。。。7 m+ J+ A* `/ g, M4 Q4 ~+ Z' R
    # W& q# v, q- c9 m
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。# F; m$ n) H) j8 I1 V2 K% {1 O/ G
    & ?/ g7 U7 A8 c, f5 A! c
    而加上内循环,光jmp和dec指令就至少多执行了6000个,慢个几十倍不是正常的么?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    擦汗
    2024-12-25 23:22
  • 签到天数: 1182 天

    [LV.10]大乘

    8#
     楼主| 发表于 2022-9-25 00:46:56 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 01:09 编辑 $ \2 I6 J. [/ l  T4 U, L
    数值分析 发表于 2022-9-25 00:20
    # X" i/ v# @0 }% s4 H1 A% F这个不是这么比的吧。。。
    2 N( N) v& p. z* @1 }. L; @+ O6 E
    0 c( R1 ?7 g; [; Q! i! o: v您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    ( K( S7 V5 q# {8 P7 Z/ S/ ~" Z# V9 @
    ( k+ V! I  q, U' W5 `6 \
    有道理。
    * t+ g- v( H2 s! ]9 J; w( j5 m% m$ _所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,记得 numeric 库里有算向量内积的,我回头试试。2 K, Q) Z2 W7 N

    0 m, V6 v: v# R8 q我先尝试尽量用标准库,一个小程序,不想搞得太复杂。多谢了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    9#
    发表于 2022-9-25 01:27:53 | 只看该作者
    雷达 发表于 2022-9-25 00:46
    ! L+ |3 j( _; P, X7 P有道理。
    * ?4 r. v: ^1 N) A& ~. @) V" r1 T所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,这大 ...

    2 I+ T* o* Z/ Q6 j. ?你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子,把循环本身翻译成机器指令loop或dec/jnz,两者速度上会差很多, {/ l) b. z& r$ |
    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
    & Z6 ^$ s% t! b& m( _% F1 T这个不是这么比的吧。。。
    + d+ @: [4 g6 U, F$ r* W3 ^" k
      p5 w/ b! N  _  z% w您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    而加上内循环,光jmp和dec指令就至少多执行了6000个

    4 B1 D4 H  f" Q6 o
    7 [( e- v( ?$ F( g* \5 y$ C现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果循环这样跑,花不了多少时间。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    昨天 06:02
  • 签到天数: 1924 天

    [LV.Master]无

    11#
    发表于 2022-9-25 02:06:44 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 02:16 编辑
    2 h  v; T$ h/ {) k
    沉宝 发表于 2022-9-25 01:48# Y9 Q0 r% S7 X; r) z) g
    现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果 ...

    7 I5 F% h5 X2 N* L* j1 w/ o) e# I$ l! ]) J; D
    是的,兄台说的对。
    7 J, y9 Z! Z9 k# x" G5 r2 b; \) r7 Z/ p$ S. B
    其实我想说的是 真正数值计算部分和代码中其他不直接计算的overhead的比值这个事儿。
    0 J# m! [# U1 O( G1 i2 G# V6 n) [' b. p* L+ l
    雷达兄构造测试用例的时候,屏蔽掉了所有计算的部分,使得剩下的都是overhead,这样run time比较的结果就显得好像不合理了。如果把计算加回去,计算部分的run time会dominate,结果就不那么离谱了。因为不好说,所以用指令数对比的方式试图直观地说明这一点。5 |$ @; ]( V6 P5 }* W& Q( d, x" W1 z

    - y% Z( g5 d0 q* ~' G+ \. \比如说,如果有计算,那么跑六千个循环相对于计算应该用不了多少时间。但是如果一边是什么都不做,另一边是六千个循环,那六千个循环比什么都不做慢几十倍了,就不是那么不合理了。
    5 P0 L+ K1 T  H) X! p0 d6 f4 I8 A* g0 k; q3 M3 g) [) u
    当然也有可能像兄台说的,是优化参数的问题,但我觉得更多地是测试用例设计的不合理。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    擦汗
    2024-12-25 23:22
  • 签到天数: 1182 天

    [LV.10]大乘

    12#
     楼主| 发表于 2022-9-25 04:47:43 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 04:49 编辑 ! W/ ~) {7 c1 Q; _
    沉宝 发表于 2022-9-25 01:27" r; P; M1 |3 ]
    你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子 ...
    , I1 {& z/ E" z: t. S' h- F

    # f- O9 L# W# R' D3 t7 `又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差一倍,我上面这个差的太多了。0 K4 z* c% C2 v3 c- G/ h: m# K

      |  k% h* S) g, y9 l/ Y我已经完全懵了。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    13#
    发表于 2022-9-25 05:51:23 | 只看该作者
    雷达 发表于 2022-9-25 04:47
    ! w4 u6 }( p% t. w# l/ d又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...
    ! @4 U* n! u4 c! n9 k; L
    时间差一倍的结果可以接受。
    % I3 a1 B$ |  v6 L9 T# k/ n$ j8 k% T! e; S
    你还是用profile工具看看吧。现在大家都主观瞎猜。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    昨天 06:02
  • 签到天数: 1924 天

    [LV.Master]无

    14#
    发表于 2022-9-25 14:58:59 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 15:38 编辑
    / F7 Y  \& p$ h2 A
    雷达 发表于 2022-9-25 04:47! v! j! D6 O5 }/ J" L$ f, M- N3 Z" D
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...

    0 I. z5 Y# o$ _
    # k! a8 I' i+ g6 [: Z- G, G4 Y' n- h9 ], f$ T

    $ B  ^5 b# y2 M: C0 r8 ]8 K6 I能不能把这个也贴上来,看看和上一个有什么不同?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    擦汗
    2024-12-25 23:22
  • 签到天数: 1182 天

    [LV.10]大乘

    15#
     楼主| 发表于 2022-9-26 01:30:03 | 只看该作者
    本帖最后由 雷达 于 2022-9-27 01:17 编辑 ; S, r2 K- Q' o! [9 Q" S. F
    数值分析 发表于 2022-9-25 14:58
    3 R( v% K4 R. U: J6 A9 X% [能不能把这个也贴上来,看看和上一个有什么不同?
    - [, z% H, P# A7 m$ Q  M
    理了理思路,重新做了一个测试。! R, X$ y# g/ [% v: i& F
    做了两个 vector 和 两个 float *, 都长 100000
    , F8 P* B  ~" F8 b- }  X, Z+ P外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache./ Q7 b) q  ~0 E
    # P7 u/ X; y4 X4 X2 N" G0 ^
    内循环试了4种方法,' m7 R8 M0 k& O
    1. 直接调用 vector inner_product 247s + F- b! U3 V- r" z8 k- Y  M, \
    2. vector 循环点乘累加 237s# P8 T! a- x& a2 r1 r
    3. float * 循环点乘累加 204s& h2 R' P0 V: @+ X  H/ {1 y
    4. 空循环 100000 次 202s
    , T: @' Y& P' M0 A3 i8 M0 V0 j- _" V; _! H6 _* H
    不做内循环 200s% N; [7 r: `  b+ Q* t/ E! A
    - M# o6 P3 |3 U: ^; z& _- L2 Z
    你昨天说的对,内循环本身占比是很小的,大头在其他处理。
    % m( \. ^* [/ a  W4 m) @另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
    7 W2 |8 o& p" |% d. |8 T! x& F) d5 x4 u# U
    至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)8 u" d4 [) b. R3 ^; e& c1 P+ M
    7 h& N" L$ s8 q3 v. S" f% E) A# Y
    (为什么下面我贴的  b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成  jj 好了,原来 方括号里的 i 是斜体标志  LOL)& H2 q5 c; E8 D
    % a; l" ~, {5 z; k2 b
            std::vector < float > vec1(N);, l. X7 J' s+ x; h) b/ g0 `
            std::vector < float > vec2(N);
    & }- I/ ^' p- P. y1 z& Z        float* b1 = new float[N];
    4 ^8 v0 I' M  C% ~( J/ C        float* b2 = new float[N];
    0 V" v- n. g+ G, |/ m/ `( m1 Y6 y/ e8 F' k2 _
            for (int j = 0; j < 6000; j++)
    " V% j; O0 H; ?% j% ~        {% k, a) t% A4 V/ }7 C
                    std::generate(vec1.begin(), vec1.end(), []() {  t/ D6 w) H  e  s" f
                            return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;5 B  ~# }8 i5 }9 R
                            });
    & Z# Y( ?& M2 F5 K' {0 D8 f/ k
    ! z9 s. e8 @1 A3 I& Z* ^4 ~                std::generate(vec2.begin(), vec2.end(), []() {+ G% J2 w8 j' [' m9 X
                            return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;' O  m- w5 p# z
                            });: J/ e2 M5 z! q- B9 H) U. Z

    * m! ^7 c4 W) C                for (size_t jj = 0; jj < vec1.size(); jj++)
    - W% X2 P2 n& e% [8 W" @% Q                {5 F1 u# R# J# c2 S! M' r# s; j8 f1 [
                            b1[jj] = vec1[jj];
    3 a3 S' w8 h% }  a3 o* [4 S/ d( W: @                }
    ! h. L, L- `5 \# ~
    , H" M7 P5 X/ i' x, |( E' O& r                for (size_t jj = 0; jj < vec2.size(); jj++)5 i- c0 G% l  y5 F5 P7 [: N$ G
                    {
    * R! H  M7 f) ?( N+ ?                        b2[jj] = vec2[jj];: r- a4 P5 l0 A; _4 t
                    }
    , b! c! R9 \: B$ L( ^) V4 @/ u9 H7 X' m0 K0 p2 y
                    //Method - 1  N=100000 247s  
    9 a4 C- ?. V" F6 p+ N                //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);0 |" ~  F. X% F& Y8 }0 s
                                    
    ( [, t, V6 s# ?: q' e7 m' ~- }# A, F                //Method - 2  N=100000  237s
    ) s- R1 K+ \& S) {. N0 h1 L; [                /*
    . k1 s) ~- Y8 t! L9 z' w3 ~  m                for (int jj = 0; jj < N ; jj++)
    2 u- K) a$ P. h: v                {
    * I2 Y' s( w: S                        fresult += vec1[jj] * vec2[jj];
    0 Q8 f, T9 u; p8 c                }4 |. i, r- }. h0 x7 F" m2 ^
                    */
    1 X$ X; G( m3 e1 G- B                                
    0 f$ ]# f* T) i& \0 a  e. X$ q                //Method - 3  N=100000 204s+ e0 ]4 R3 }3 X
                    /*  S$ x+ m& ]9 q; y. C+ z
                    for (int jj = 0; jj < N; jj++)( n* {# X6 {% G, Z" z+ C
                    {3 `# ~2 Q2 |" e$ e! l7 B+ H* j7 N
                            fresult += b1[jj] * b2[jj];: q( e0 L9 E; q% ^( k) _
                    }8 [. k' X' X* q' B3 T# s0 {
                    */
    - R: B( k4 _6 g7 X4 p' d( j7 g7 [
      N( t) y4 A5 n0 J3 `                //Method - 4   202s
    ; A0 U* \- w& U; }0 t& r                /*# N7 x4 ^; S: o, a
                    for (int jj = 0; jj < N; jj++)
    ' I4 Y/ o; H2 O! B5 |                {: [/ ^9 ~" w# _
                            7 N. H0 u8 p/ j* P
                    }
    ; @2 I+ Q1 B# E5 T                *// `- s% N) _/ }: T* _
                    //comment out all methods, N=100000  202s                2 J; J- r9 ~* Z  f4 ~
            }% f* Y" r) A  A0 `# K# T5 K

    ) e+ ?9 A% V0 J0 E* c' s        delete []b1;
    ( C0 `0 k* h; v, R' S( P        delete []b2;
    # V! J  _0 Q5 ?8 c' E; o7 `* X8 s& ^" e
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    16#
    发表于 2022-9-27 00:15:38 | 只看该作者
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?
    + S' [/ v% g* k/ Q  B2 h1 Z: k3 q; j' D4 E- a6 D% P
    你第二个试验里面的j在循环里面又重新定义了啊,你确定真的跑了6000次?
    & B/ M: m1 ^0 [" C) h9 N" B5 z
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    擦汗
    2024-12-25 23:22
  • 签到天数: 1182 天

    [LV.10]大乘

    17#
     楼主| 发表于 2022-9-27 01:16:03 | 只看该作者
    机器猫 发表于 2022-9-27 00:15$ O, z0 n! e0 G5 T/ [- N
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?. z/ Q# N- O2 d' Q
    % x8 o8 z  H" \9 L+ I+ M) ~
    你第二个试验里面的j在循环里面又重新定义 ...
    ' \  f" f5 e7 G4 S
    内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL
    ) N! W$ H6 g! O. R4 B7 J( m! F8 j, s! O; u% j/ N
    不和它较劲了,瞎耽误工夫,我已经转到 ubuntu, 也准备顺便试试 avx2 向量化。
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    18#
    发表于 2022-9-27 02:06:58 | 只看该作者
    雷达 发表于 2022-9-27 01:16/ P- Q8 Z7 x, H  ^5 p) f1 I
    内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL" l! Y% ~* O/ C8 k$ r+ b
    ( r% ~8 y* n7 p# Y2 t# @' W  H
    不和它 ...

    2 @& c6 L. U( [4 [
    0 e( h* M3 K7 P  ^0 }3 Z- \不过可以试试我说的register变量。前一个试验j是混在一堆其它变量里一起定义的,很有可能是在stack上,这样内存读写会更多,要是再碰上每次都需要加载cache就更慢了。# R' }  y# H" M5 U) h
    后面一个是在循环那里定义的,说不定编译器就把它优化成register变量了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

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

    使用道具 举报

    该用户从未签到

    20#
    发表于 2022-9-27 20:29:50 | 只看该作者
    雷达 发表于 2022-9-24 23:54: d8 A% w$ R  v) X
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)  t. r( Z; k2 ]7 r0 a2 H% k
    {+ z6 o: d3 Y& h+ x
            comp temp, xtimesy;
    3 O, B- K+ n  e3 n) \- p4 D$ J
    这个code里面如果Openmp没有被注释掉的话,那么temp那个变量应该是定义在循环里面,否则线程之间会存在争夺写入那个temp的风险。; u3 o1 t9 d6 r: f& D2 P" g% v
    内层for循环如果没有内部操作的话,编译时应该被优化掉了,和你完全注册掉整个循环是一回事。可能你的编译设置没有打开优化?
    + q4 T5 ]; O; j" i/ vVS社区版没有问题,我工作用的就是社区版,设置正常的话不会比商业版差。以前游说头头用Intel Compiler,他说不想花钱,而且差不了多少,就一直用到现在。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2025-7-2 20:04 , Processed in 0.054492 second(s), 22 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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