设为首页收藏本站

爱吱声

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

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2022-9-24 22:54:26 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
    C++ 比 Octave 慢好多,怎么破?) {1 Y* f+ p; w) o
    " x, i/ t1 [$ C9 _: X: j& m5 I) A
    自相关两层循环,内层循环涉及浮点数计算,试验了一下把内层循环内部全都 comment out 只留个壳子,  但空的内层循环本身就把速度拉下来了,看来问题并不在浮点计算。
    , i, \2 f# u3 Z* E  m% K& N+ z* I* ^/ x" w% K/ z
    速度优化问题真的很有意思啊。/ _. a# t' Y9 Q! W% d4 J. w
    / ]! F- W; U  q: {' A! V; k3 U
    欢迎大家继续讨论

    评分

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

    查看全部评分

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

    [LV.Master]无

    沙发
    发表于 2022-9-24 23:04:16 | 只看该作者
    拉下来?拉多少?
    0 z1 [( x/ p, I2 @% {把代码贴上来看看?
    7 E* ]6 P4 l/ e8 I# H6 C. |( ~& [$ a3 a
    难道分支预测不准破坏流水线执行?不该啊。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    板凳
    发表于 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 编辑   ?4 p: |6 O" {' a% l) c
    数值分析 发表于 2022-9-24 23:04
    ( H& }3 c2 x9 z% Z; B, o拉下来?拉多少?, h1 T- T# f8 z, D4 V. a/ L
    把代码贴上来看看?

    3 w, M: y- z4 q0 y9 s
    1 s2 S' S) R6 tvoid xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)0 g% R6 q3 e6 S) E7 s
    {* n) W, B8 p0 {4 F1 \) t
            comp temp, xtimesy;6 t1 E+ _1 }& N
            xtimesy.re = 0;$ \) n/ @* X/ f
            xtimesy.im = 0;
    ; H* s% s7 T' h, h. |        int j0 = lenB - 1;
    / A0 F/ Z( h! d8 P2 E# T        int    i, j, i1, reali;# N* q4 S8 B, _& g/ \4 w
            if (lenA % 2 == 1)" t# U# j7 ~2 x) ?3 ^! T1 f
                    reali = lenA + 1;7 t2 ^. D8 e; {- U
            else
    # q9 [. v" F# C1 k2 {& N0 {                reali = lenA;4 S  [. s- E7 i9 a! V2 `  p1 N! M
            reali /= 2;  y# Q& x2 K! L8 G4 [

    7 t7 N4 x$ M) {1 z  `$ u! d        int nconv = reali + lenB;
    ( h9 j! j3 d- X        //#pragma omp parallel for
    ! _  r8 G5 t  x# F        for (i = reali; i < nconv; i++)9 t& g6 l/ a& [: T; F5 f
            {
    ( w+ y! ^" n; l, p/ H0 j, E/ a! ]9 t                temp.re = 0;
    8 H" t" z& i' j3 m) G) I" K4 R6 x                temp.im = 0;
    7 G# A5 C$ o; Q* h* B$ ?                i1 = i;4 t) n" k" z7 C$ p7 F
                    for (j = j0; j >= 0; j--)5 }, K( g% q, _% W1 A1 p
                    {
      {9 I, {" z6 P, Y0 R! R                        /* floating date operation */
    # \$ @& ?5 ?  z# d0 O$ h7 h                }
    ( q$ r& [5 O; y. v; j2 _
            }* c$ `. r, U9 N- w0 `. U% d5 c9 {
    }% R( w$ Q! D2 A- a( I* J$ |9 k* N0 }2 M
    7 @1 I3 j$ H3 J6 {
    xcorr函数代码如上,comp是复数struct, 做过长度为11、19两个矢量的测试,和octave结果完全一样
    $ W+ Z; S# R4 r2 D5 j
    # D, T9 B, j# u3 D红色部分是内循环,现在其内部操作都comment out 了, j0大概是 6000。
    ( U& x+ Z, Q8 X- M) d' ?* v. J, s现在call xcorr 100次,耗时78s.
      B$ T7 c# n6 X' [; H8 Z# @5 @% W+ B0 q$ a: Y2 w# m! l' ^
    如果把红色部分内循环本身完全comment out, call xcorr 1000次,耗时 <1s. " o; k0 W9 i& N& J" L

    4 e( s# K" U  b. [% S
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    6#
     楼主| 发表于 2022-9-25 00:17:17 | 只看该作者
    风雨无阻 发表于 2022-9-24 23:33! f- `3 T2 L6 S) D' z
    Maybe Debug mode?
    3 f; v/ j  o8 D: I

    3 N* s0 K# ]9 k+ t不应该,看我上面的回复。
    ; |, H) P' H6 n' d9 t. r' Z$ i. B9 y2 o
    我更怀疑是 VS 社区版的问题
    回复 支持 反对

    使用道具 举报

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

    [LV.Master]无

    7#
    发表于 2022-9-25 00:20:10 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 00:24 编辑
    1 C6 R0 I9 B% s- B* b; c5 T
    雷达 发表于 2022-9-24 23:54# K9 i3 W0 F) b2 p( `: C% _
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)8 r. I$ g8 p  T( C, W) ?
    {6 Z+ N8 @' W. u' j( b% v/ D
            comp temp, xtimesy;
    - G! Y( o. D/ }8 W- m
    1 s( e6 V6 V; B4 D9 i0 j" b' N
    这个不是这么比的吧。。。% T9 k4 q% P! O- E, [

    ; [' ]! q  V" y/ [6 ?$ ^您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。& k2 _) O- y  f. |( P
    5 S, k3 a6 h/ l/ K' x9 `8 D) \
    而加上内循环,光jmp和dec指令就至少多执行了6000个,慢个几十倍不是正常的么?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    8#
     楼主| 发表于 2022-9-25 00:46:56 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 01:09 编辑
    6 p) c8 H* _1 G' d( {" \; l
    数值分析 发表于 2022-9-25 00:20
    % \& F0 l# t- L7 ]5 a" Y8 x& {这个不是这么比的吧。。。0 K# g$ l2 V0 E

    ) _9 a- O" r! J& l+ W4 b; G您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    ! V/ \) C0 r5 V) m7 X
    ) W, i. H4 x% ]' h, |
    有道理。: U- V* B( o: T6 F9 W. O: L
    所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,记得 numeric 库里有算向量内积的,我回头试试。
    ) f4 i0 s* Z) N7 L
    3 B+ M& @1 G5 \  k我先尝试尽量用标准库,一个小程序,不想搞得太复杂。多谢了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    9#
    发表于 2022-9-25 01:27:53 | 只看该作者
    雷达 发表于 2022-9-25 00:46
    ! g# ^" X3 o( }5 g" P+ k5 J有道理。
    ) v; z$ N7 o' v2 V, ?1 r所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,这大 ...

    % h) o" \6 i! @# c4 X. n你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子,把循环本身翻译成机器指令loop或dec/jnz,两者速度上会差很多; N5 w0 t1 C# g: u6 Q3 Q
    Why is the loop instruction slow? Couldn't Intel have implemented it efficiently?
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    10#
    发表于 2022-9-25 01:48:51 | 只看该作者
    数值分析 发表于 2022-9-25 00:205 ~1 v* |8 R4 A7 h* W0 H
    这个不是这么比的吧。。。
    # u0 W0 v1 N3 T; e& X- p4 D7 s
    4 f& h; E0 w" J- n4 g) Y$ K您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    而加上内循环,光jmp和dec指令就至少多执行了6000个

    / W" p4 X& t2 n3 U  `
    7 }* c% k5 U+ [, U" ?现在的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 编辑 . K, B4 `( K, I! E
    沉宝 发表于 2022-9-25 01:481 e! v7 w! `( f  Z8 V
    现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果 ...
    8 F5 A4 [  r8 `/ z! `$ z( @- e
    6 K1 B5 _1 P- ?
    是的,兄台说的对。
    + f( r* w; X' W
    ( q+ D# C$ W+ f8 G1 d' Q其实我想说的是 真正数值计算部分和代码中其他不直接计算的overhead的比值这个事儿。
    $ y/ n: o1 w7 B7 W8 Y+ S6 }3 h  @9 g( x' S# o8 x2 q5 E
    雷达兄构造测试用例的时候,屏蔽掉了所有计算的部分,使得剩下的都是overhead,这样run time比较的结果就显得好像不合理了。如果把计算加回去,计算部分的run time会dominate,结果就不那么离谱了。因为不好说,所以用指令数对比的方式试图直观地说明这一点。
    2 L6 Z# A$ ]) ?5 c5 n
    ) w) x3 U) B) f3 d比如说,如果有计算,那么跑六千个循环相对于计算应该用不了多少时间。但是如果一边是什么都不做,另一边是六千个循环,那六千个循环比什么都不做慢几十倍了,就不是那么不合理了。
    , I" w4 S% R  y+ v/ J$ g
    ( s3 d# c) _# h  ?当然也有可能像兄台说的,是优化参数的问题,但我觉得更多地是测试用例设计的不合理。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    12#
     楼主| 发表于 2022-9-25 04:47:43 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 04:49 编辑 6 F8 A* M* I) M5 ?2 R& k9 Y
    沉宝 发表于 2022-9-25 01:279 f$ l$ N; m" t% o. l; d
    你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子 ...
    4 F3 D3 u4 T9 Y5 L' s% s& Z
    / K, s  b9 O% K8 [
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差一倍,我上面这个差的太多了。. m; O0 c5 Z9 j; N: ]
    % c+ b% U: f8 W% K( w1 A
    我已经完全懵了。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    13#
    发表于 2022-9-25 05:51:23 | 只看该作者
    雷达 发表于 2022-9-25 04:47
    - K6 Z4 T' P! K/ ~2 d5 L5 |) g3 m又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...
    " _0 v. n% H! c( t
    时间差一倍的结果可以接受。
    0 ?6 e+ G+ }% t  J8 O" w4 h6 W) x: f( G: T$ M: O
    你还是用profile工具看看吧。现在大家都主观瞎猜。
    回复 支持 反对

    使用道具 举报

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

    [LV.Master]无

    14#
    发表于 2022-9-25 14:58:59 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 15:38 编辑 - r- V- p" Z+ k- V3 V+ \7 b
    雷达 发表于 2022-9-25 04:47" [" m/ q# |  Q0 R; p1 Z$ x, T, S
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...
    ! t, v' Z4 p4 A" Q0 A# v6 W
    / X. H/ ~8 E, V( \/ o$ X% x
    , |; y5 L! g3 \" \- T8 W8 \/ e/ I

    + {7 l. k6 i- Z; b能不能把这个也贴上来,看看和上一个有什么不同?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    15#
     楼主| 发表于 2022-9-26 01:30:03 | 只看该作者
    本帖最后由 雷达 于 2022-9-27 01:17 编辑
    * }: O9 S% T$ q% Q2 W$ w
    数值分析 发表于 2022-9-25 14:58
    # q. E9 L& k4 W5 O4 y能不能把这个也贴上来,看看和上一个有什么不同?

    1 }5 _+ F3 ?% a! s( H理了理思路,重新做了一个测试。
    5 {- w4 R: y9 s4 K3 j5 r  M. ]做了两个 vector 和 两个 float *, 都长 100000% [  l0 `- z6 w& W0 W2 f
    外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
    . Z3 P4 x. P% W9 `9 g6 r# Y+ ]' |( K6 \+ H# J
    内循环试了4种方法,9 _! `; x$ F6 w3 j: [1 w. ~- t; F3 N' f% |
    1. 直接调用 vector inner_product 247s
    8 o" p/ |$ ~2 e) ?9 w5 p2. vector 循环点乘累加 237s) ~) c) w0 w6 `3 Z- Z+ H3 c" k8 {, e
    3. float * 循环点乘累加 204s
    ; T2 g% T4 ~  r* J  N3 ]# ]4. 空循环 100000 次 202s
      F+ R; c' V" U3 y5 A+ u
    9 Z" ?' E" X5 ?: T: R不做内循环 200s# c  m; z8 Q/ J) q4 p. Y

    ; P) J" u* w8 _& A& ~. Q你昨天说的对,内循环本身占比是很小的,大头在其他处理。
    ' F! q; O% c) H) z# Z另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。/ M, t1 c; x) Z1 N* @
    " _# n; C7 G8 _( G, \
    至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
    $ y2 p3 y% f/ I! h0 W1 {$ R$ j/ W( G
    (为什么下面我贴的  b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成  jj 好了,原来 方括号里的 i 是斜体标志  LOL)- V: G. |: A  V
    ' M+ i! N" k+ D. r) q* @
            std::vector < float > vec1(N);
    8 |3 L) Z9 v4 _, M        std::vector < float > vec2(N);
    / i; s! i" {/ b$ ]8 _7 @        float* b1 = new float[N];. l, |+ c% L$ Z( D: w; F- `  S& n
            float* b2 = new float[N];' K7 n8 m( Q9 y1 Q6 B$ [& m

    ' \/ O- W* s/ ?: o; w" I        for (int j = 0; j < 6000; j++)
    0 R! M; n1 D7 C- R! j3 x        {& p3 N) H) s+ y/ W# W! H6 }" v
                    std::generate(vec1.begin(), vec1.end(), []() {
    ; L0 |% t. x; I                        return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;) I( |* \6 n& U% @& B9 }4 j# ?
                            });
    ; Q& C' h+ y& q" g/ r  U# ?( L, `! F( A, r: V3 D
                    std::generate(vec2.begin(), vec2.end(), []() {
    : `0 K3 k+ B  N$ X- _8 t& @+ z# U; M                        return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
    6 ~# U& v1 c6 ]3 S7 X7 V! |                        });: X3 x) V; ^1 j9 T' h

    ! a9 D% W3 z2 q$ \1 V% O5 e                for (size_t jj = 0; jj < vec1.size(); jj++)
      y: |) ]  x9 G& j' b1 [5 v; e                {
    ; b$ H) e/ D0 a+ z3 z& E                        b1[jj] = vec1[jj];. W  {6 B# j0 r' W
                    }% j$ j; a# ]3 C+ k( `; }  n/ I
    & x  o  l6 f6 o1 X; X
                    for (size_t jj = 0; jj < vec2.size(); jj++)# @8 b# u4 I2 |( V9 l, a% ]
                    {
    7 t/ F+ s( s- K( I8 x                        b2[jj] = vec2[jj];- E( T; _/ E3 F% b2 V
                    }' ^/ \7 ], \& ]3 m0 B. O: ]
    ' `  v$ r: O4 z; G8 L
                    //Method - 1  N=100000 247s  - c" I0 N* S0 O5 o" j" w
                    //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
    ; f/ H" Y4 N+ x7 l+ x  l                                1 C6 A9 E9 l0 q4 p# ]- X' E
                    //Method - 2  N=100000  237s
    ! M( E* m$ V! N; ^                /*
    + O( l7 F% b/ V7 Z5 C  S8 w                for (int jj = 0; jj < N ; jj++)- \0 U1 s! f4 _! p
                    {
    + ?4 A+ ~: b$ t$ c1 F& `) E4 o( P                        fresult += vec1[jj] * vec2[jj];
    / h6 S! y4 {7 z. Q" b1 k  s0 h/ f                }
    + V! k* U9 c8 a- l, T8 q% B                */9 w: @( x. E; l: n
                                    
    6 n8 ~0 c4 ^$ G. C! a# {                //Method - 3  N=100000 204s
    3 \  b# O' A4 I# P  q( O0 q+ }                /*" C0 x3 Z0 Z6 \% R& x3 p% E: z- @' T
                    for (int jj = 0; jj < N; jj++)! ?+ J, f) i/ W  z) K" O; a
                    {
    ' d  _# L! a" U* T" q                        fresult += b1[jj] * b2[jj];
    " T  H& [7 |, z0 r; [# T                }; |. j- G" y1 _/ l7 ~
                    */
    2 p4 L5 A% V: A& j. @, k0 ?+ R* c# I) @7 ?6 f
                    //Method - 4   202s
    0 f( r% N3 {3 h: l                /*
    5 p( `( a7 p6 m: {- r                for (int jj = 0; jj < N; jj++)( ^0 f# Q  r+ K* p# o
                    {
    8 e0 i) l  s' Q/ f/ ~- K: N                        
    4 L  o- U* X! N, j6 w/ u2 o                }/ L0 x# i( [* ^  i# Q% ^- a
                    */
    : |: u' k3 t3 V$ |2 i6 G. g                //comment out all methods, N=100000  202s                + D6 r/ s- W! a- L1 a) h
            }, Z. k  w7 g/ h* i1 ^
    & P/ f1 k* q* C; v
            delete []b1;
      X5 D, k! R4 j5 T$ H4 l+ H        delete []b2;

    ( @2 o4 A& g0 f4 l
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    16#
    发表于 2022-9-27 00:15:38 | 只看该作者
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?6 u9 s' U6 T5 F! q) q2 n7 y

    ' {$ a$ A" b4 I# ?$ a" u7 m你第二个试验里面的j在循环里面又重新定义了啊,你确定真的跑了6000次?% z5 [6 D& S3 q2 Z
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    17#
     楼主| 发表于 2022-9-27 01:16:03 | 只看该作者
    机器猫 发表于 2022-9-27 00:15
    7 R, j! v6 H& E瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?7 M5 D3 A) k$ g! y; V6 \) r
    " ~% j3 M1 E+ Q% E" E
    你第二个试验里面的j在循环里面又重新定义 ...

    & ]6 b+ @* w; d  U) H) g3 B1 k内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL
    8 I0 L& G6 B$ y# q2 J/ e- p! o
    * y: O# ?# ]& ^% e, O  ]$ l: j不和它较劲了,瞎耽误工夫,我已经转到 ubuntu, 也准备顺便试试 avx2 向量化。
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    18#
    发表于 2022-9-27 02:06:58 | 只看该作者
    雷达 发表于 2022-9-27 01:16
    ' B1 c( t# ]5 Q! i内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL. z2 Q: i/ b( O; y2 d2 w: @
    5 ]9 J/ e$ v& }: f% u, p
    不和它 ...
    9 a* M2 D7 \( j) u6 P
    . H* J0 s7 ~4 F5 s) V3 s
    不过可以试试我说的register变量。前一个试验j是混在一堆其它变量里一起定义的,很有可能是在stack上,这样内存读写会更多,要是再碰上每次都需要加载cache就更慢了。- N. H5 @- j' X2 W# B
    后面一个是在循环那里定义的,说不定编译器就把它优化成register变量了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

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

    使用道具 举报

    该用户从未签到

    20#
    发表于 2022-9-27 20:29:50 | 只看该作者
    雷达 发表于 2022-9-24 23:54, v, ^2 y, i$ ^2 ~% O* M1 S: r
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)- I5 E0 F  F! J5 r/ l2 Q9 K
    {
    + V) ~' x# l0 ]$ O9 o& d$ U        comp temp, xtimesy;
    ! N% b1 C3 I5 M: r2 L6 C
    这个code里面如果Openmp没有被注释掉的话,那么temp那个变量应该是定义在循环里面,否则线程之间会存在争夺写入那个temp的风险。
    * q' z+ P/ h9 \  u) |; Z内层for循环如果没有内部操作的话,编译时应该被优化掉了,和你完全注册掉整个循环是一回事。可能你的编译设置没有打开优化?: q( t2 D. T( Q' U3 w1 c$ \
    VS社区版没有问题,我工作用的就是社区版,设置正常的话不会比商业版差。以前游说头头用Intel Compiler,他说不想花钱,而且差不了多少,就一直用到现在。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2026-7-21 16:07 , Processed in 0.068839 second(s), 19 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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