设为首页收藏本站

爱吱声

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

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2022-9-24 22:54:26 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
    C++ 比 Octave 慢好多,怎么破?
    - z: N9 t/ e. h$ a  L5 o4 l5 u' ~% j# c% Z3 a+ j+ a; X: x0 f1 X
    自相关两层循环,内层循环涉及浮点数计算,试验了一下把内层循环内部全都 comment out 只留个壳子,  但空的内层循环本身就把速度拉下来了,看来问题并不在浮点计算。
    ) m9 E: y) a4 A" Y
    / }9 }; A/ c7 u; t) P8 ?0 O速度优化问题真的很有意思啊。
    # a# n! i6 L" H/ V& x( S2 X9 }- [* Y. N* R+ U3 J
    欢迎大家继续讨论

    评分

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

    查看全部评分

  • TA的每日心情
    开心
    2025-10-27 04:12
  • 签到天数: 1953 天

    [LV.Master]无

    沙发
    发表于 2022-9-24 23:04:16 | 只看该作者
    拉下来?拉多少?5 D4 q* i9 M! C8 ?) Q7 t- Z" {9 c
    把代码贴上来看看?
    : q! l& p$ _# s5 ?
    4 x' r8 D0 M  P8 e8 C# b/ {难道分支预测不准破坏流水线执行?不该啊。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    板凳
    发表于 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的每日心情

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

    [LV.10]大乘

    5#
     楼主| 发表于 2022-9-24 23:54:10 | 只看该作者
    本帖最后由 雷达 于 2022-9-24 23:57 编辑
    6 b6 r, s3 F7 j2 i+ L& Y; c3 p& z
    数值分析 发表于 2022-9-24 23:045 I7 e+ e; W0 j
    拉下来?拉多少?
    - T) V6 J, l! v& U. c5 V把代码贴上来看看?

      x5 @! Z! b, x! x& C$ Q/ _1 O9 D% _3 c( y) X
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)' n5 Y* c1 s3 D1 }) e$ U
    {  N$ R; ^; F# u% ^$ T6 M5 c
            comp temp, xtimesy;# P( s8 y+ k- j9 y, s: n
            xtimesy.re = 0;
    ! Y9 w5 t+ s  j& f; P0 F9 `9 s        xtimesy.im = 0;0 j4 h8 ?" x  u& G' H1 j
            int j0 = lenB - 1;
    7 q2 t. K5 _, L; N5 n2 X( @        int    i, j, i1, reali;3 m7 z  x5 k& R5 I! E" V
            if (lenA % 2 == 1)2 W" p) o8 s2 U7 M7 U! S
                    reali = lenA + 1;
    * j, ]( i, [9 j( J        else  |6 R" H& s. p6 D
                    reali = lenA;/ N7 o6 Y. y/ h# H& C$ m  b6 j
            reali /= 2;
    . y5 {5 ?% W  u( ^% H  j0 B2 U; y
    0 E( \$ ~5 d. ~) G" d$ D        int nconv = reali + lenB;0 g! G+ Z; q+ E
            //#pragma omp parallel for1 C5 p: c( j# m8 |$ K) |5 w5 \
            for (i = reali; i < nconv; i++)3 Q4 |& l: ]7 I) n5 U4 G
            {  @$ x- X4 E) u# ]3 t$ F$ t$ c8 k
                    temp.re = 0;3 J% C! {+ D- {3 ~, k" P
                    temp.im = 0;
    ' T% A+ O# |, p: c                i1 = i;
    ( {' m, j, c' t$ O7 p- M                for (j = j0; j >= 0; j--)1 U* [0 e! h5 x+ Q1 |
                    {
    , [6 F0 Z8 ?# E7 E; R* v, ^# B                        /* floating date operation */9 F$ d9 a/ k) ~. a1 Q; D! h7 z
                    }
    0 s- m5 t- z# V/ p+ C( z  p
            }
    2 e% z5 q( w. z1 \6 @}, a/ H' I4 g' \

    . @! g/ A5 Q. B- l6 Zxcorr函数代码如上,comp是复数struct, 做过长度为11、19两个矢量的测试,和octave结果完全一样
    8 M9 H& H+ u7 C* o! E: @; s: G, K1 K, Y5 q3 C5 m
    红色部分是内循环,现在其内部操作都comment out 了, j0大概是 6000。) W; O9 C8 h' B0 V" b/ W& W
    现在call xcorr 100次,耗时78s.  H9 d4 E+ M& u, K+ z+ X& J% n5 u

    7 `9 R4 f& J) Z: ]1 T5 `如果把红色部分内循环本身完全comment out, call xcorr 1000次,耗时 <1s.
      e+ w& c/ v5 x. ?. M' s
    4 F, o. q' ~( K0 t7 y7 f' n
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    6#
     楼主| 发表于 2022-9-25 00:17:17 | 只看该作者
    风雨无阻 发表于 2022-9-24 23:33
    : f8 G* X& D& \$ G  {. Q7 YMaybe Debug mode?
    # m7 I* j, H3 w, \, B! [

    % r, _( b* v* W& J" V  U. s不应该,看我上面的回复。
    % M/ F# ?* n4 ?- H& X7 x
    0 l; n- r9 a" n' X. J. y我更怀疑是 VS 社区版的问题
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2025-10-27 04:12
  • 签到天数: 1953 天

    [LV.Master]无

    7#
    发表于 2022-9-25 00:20:10 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 00:24 编辑
    + ^5 }7 ?5 q, k  f" L. Y% A: p/ b7 @
    雷达 发表于 2022-9-24 23:54/ b& W3 v( ]: S  ~7 l
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)5 D# F7 T3 Y5 c5 C6 b3 c! m% F3 n6 ?
    {
    , k0 U; @1 d! ^0 d% u        comp temp, xtimesy;

    & b* a( |# M1 ?& {  T8 A; Q0 `4 |! h
    这个不是这么比的吧。。。/ q& x/ A' f3 Z% n4 i* b$ A
    ' T8 y  R/ }+ g* Q! h0 g
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。, n$ V% h( z; N. u
    0 f3 ^5 n5 [5 V. n1 T. 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 编辑
    - _/ r9 @0 F* L, m3 p5 o
    数值分析 发表于 2022-9-25 00:20
    / O8 e% C& t- {6 K; r# U9 T- ~这个不是这么比的吧。。。4 A& {$ W& B6 i1 U7 i% O# [
    0 ^; w  {5 M9 D  E, @: O
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。

    ' K6 x" J! P0 b. S! I1 ]
    * N" X7 j& j4 o' b有道理。2 C" \) v1 l$ U2 h
    所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,记得 numeric 库里有算向量内积的,我回头试试。
    * A9 L5 w4 l1 q" D! L
    ' H; q* M% U# ]- P6 f, H7 y3 @  o我先尝试尽量用标准库,一个小程序,不想搞得太复杂。多谢了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    9#
    发表于 2022-9-25 01:27:53 | 只看该作者
    雷达 发表于 2022-9-25 00:46
    ' q* o2 [) P. j有道理。5 U8 [; V* g5 m
    所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,这大 ...

    8 W; J& D- U1 _5 D) ?* H% ~1 B你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子,把循环本身翻译成机器指令loop或dec/jnz,两者速度上会差很多
    " p! I/ M/ s$ `0 Q) V* e; xWhy is the loop instruction slow? Couldn't Intel have implemented it efficiently?
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    10#
    发表于 2022-9-25 01:48:51 | 只看该作者
    数值分析 发表于 2022-9-25 00:20
    : y( o/ U" e1 b+ C* }" E* [这个不是这么比的吧。。。
    1 P4 w( U4 @% ~% X1 J( r3 u! F+ C) I4 |7 @1 B; ~, Y+ E
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    而加上内循环,光jmp和dec指令就至少多执行了6000个
    ; d) z  v6 {7 u4 T- Q5 |, R  o
    ! n0 a+ S! e# k
    现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果循环这样跑,花不了多少时间。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2025-10-27 04:12
  • 签到天数: 1953 天

    [LV.Master]无

    11#
    发表于 2022-9-25 02:06:44 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 02:16 编辑
    6 ^* x# X+ Q) |5 `
    沉宝 发表于 2022-9-25 01:489 n+ ?  v9 ?# E( G+ Z* [% j; l
    现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果 ...

      v9 m9 L/ E; M% R5 K8 Z
    $ Y0 k' s2 I; @! E* b是的,兄台说的对。. u" m- h; T( o3 E/ }. }2 a5 U$ {
    ' r$ @# D* o' E  d8 _7 R* Q
    其实我想说的是 真正数值计算部分和代码中其他不直接计算的overhead的比值这个事儿。" n* g) @; o8 T# V$ |2 O* `

    ' d7 a) J* E& Q. @; S7 }& @6 m- R雷达兄构造测试用例的时候,屏蔽掉了所有计算的部分,使得剩下的都是overhead,这样run time比较的结果就显得好像不合理了。如果把计算加回去,计算部分的run time会dominate,结果就不那么离谱了。因为不好说,所以用指令数对比的方式试图直观地说明这一点。
    : v* i0 c" e0 z/ D. e( o5 x2 Q' G. @1 [$ x; M4 o# h$ ]
    比如说,如果有计算,那么跑六千个循环相对于计算应该用不了多少时间。但是如果一边是什么都不做,另一边是六千个循环,那六千个循环比什么都不做慢几十倍了,就不是那么不合理了。
    , s9 i% p- y! h; g& P. g( Y! m4 L, G/ O9 _- d  B" l; o
    当然也有可能像兄台说的,是优化参数的问题,但我觉得更多地是测试用例设计的不合理。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    12#
     楼主| 发表于 2022-9-25 04:47:43 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 04:49 编辑 % J7 N- V" B) J; q' v
    沉宝 发表于 2022-9-25 01:27! i, @# o0 b; ?
    你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子 ...

    $ P  v5 d. n9 b( P% @8 b
    3 X3 L: L; m" y0 a% }4 U又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差一倍,我上面这个差的太多了。8 N- \7 @( g8 d% i+ M

    . P) ^: }/ i# a7 a# a我已经完全懵了。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    13#
    发表于 2022-9-25 05:51:23 | 只看该作者
    雷达 发表于 2022-9-25 04:47$ E" L& g. S* m) o9 \) S& L- L
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...
    ) ?( A. d* r% e+ `
    时间差一倍的结果可以接受。6 P( M; R. D& c5 U, v2 p3 `
    . R: n6 O. _. a5 c/ o6 |/ B8 {2 b0 f
    你还是用profile工具看看吧。现在大家都主观瞎猜。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2025-10-27 04:12
  • 签到天数: 1953 天

    [LV.Master]无

    14#
    发表于 2022-9-25 14:58:59 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 15:38 编辑 3 X' Z8 O/ u5 ?1 n  s/ i) \; e1 k
    雷达 发表于 2022-9-25 04:473 |9 A' c$ j; V
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...

    ! o9 Q, U- j, x9 M0 |3 ^+ _+ _7 [  |7 _/ j6 `
    4 P/ Q2 a" e4 R4 m2 v1 U' K
    " M, ^( b4 T% z
    能不能把这个也贴上来,看看和上一个有什么不同?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    15#
     楼主| 发表于 2022-9-26 01:30:03 | 只看该作者
    本帖最后由 雷达 于 2022-9-27 01:17 编辑
    9 x- _4 Y8 v: b6 u
    数值分析 发表于 2022-9-25 14:58
    ) r+ |: X8 f% P. p# ]5 P. p' u* S能不能把这个也贴上来,看看和上一个有什么不同?
    ( U9 E( c! G3 n/ n* r3 D: c6 \2 r
    理了理思路,重新做了一个测试。! ~. N- w+ J' \$ t& v! o
    做了两个 vector 和 两个 float *, 都长 100000
    * L9 P: y2 ]# \# Y) d1 a2 H外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
    + a) f) X  t, a8 J: L$ b1 c9 z* v5 ~( i5 j# b) r
    内循环试了4种方法,% q+ t2 O( X3 I2 H6 F' c9 G3 S
    1. 直接调用 vector inner_product 247s ) N& J9 o; n+ G8 p9 U
    2. vector 循环点乘累加 237s
    / p# r( _  U: X% m3. float * 循环点乘累加 204s
    % D( p7 {- z7 t) I4. 空循环 100000 次 202s+ m( y& `" v. v0 l; i
    ! u# q" j! N. X1 r1 p( q
    不做内循环 200s% J" v3 d6 W% K! z( d

    " [/ |$ U4 `' f7 Z9 P4 f7 {你昨天说的对,内循环本身占比是很小的,大头在其他处理。
    # ~# T& x1 C1 |% S另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
    ! A, b1 {" S# E  E* V2 v3 ^+ R
    ' Q6 {7 j2 j8 ?' w' F  A* h$ S至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
    3 C  b1 r  j5 Y# F# U2 M8 I! y5 n8 G0 [* _$ `" O7 k2 N6 u- j
    (为什么下面我贴的  b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成  jj 好了,原来 方括号里的 i 是斜体标志  LOL). Q( J1 g; U2 O
      ?- i# u) k) `9 L
            std::vector < float > vec1(N);# e8 F0 y- w! K5 n& C
            std::vector < float > vec2(N);
    : X! K& e  O5 x5 s% C        float* b1 = new float[N];6 Q$ t" e0 |0 u& T; H# z
            float* b2 = new float[N];
    ) a, e4 z$ E7 }
    ! B5 r: O% K3 x. ]  ]        for (int j = 0; j < 6000; j++)! I) N" F( n' U" A; B
            {
    - f# g8 D) p: R! c$ W1 P                std::generate(vec1.begin(), vec1.end(), []() {: S5 {9 D: z! Q: D' U" [
                            return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
    3 T. K% {6 }2 e6 `4 n                        });' G9 h# x+ X  l3 x: E$ e

    ' K8 f& ~9 C; f8 r# h$ G                std::generate(vec2.begin(), vec2.end(), []() {. F% z4 X% p4 x
                            return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
    3 u3 V7 u$ Z: x0 o) u$ O  a                        });
    + H$ |' j3 r8 s. \; O/ ]/ U3 ~/ Y- ~% P0 J/ j, N1 p
                    for (size_t jj = 0; jj < vec1.size(); jj++)9 F! H4 v: m: @6 C! e- c( L# m
                    {
    ' ]6 h- m1 ]3 N6 z                        b1[jj] = vec1[jj];8 d$ P6 R) L. m: h: j
                    }
    - E) I/ T6 a5 z( [3 x- S. a3 N
    , p2 \, V) Z8 Q4 g9 \& ~9 X6 ^7 N  H                for (size_t jj = 0; jj < vec2.size(); jj++)3 V. _' u0 G4 G. q; o' K
                    {' k4 b% `/ p& |, U; F$ _6 W. e
                            b2[jj] = vec2[jj];
    6 h4 t) {" R2 @1 K0 j+ S. i; Y                }# f  E1 d: Y" t7 Z/ z5 J

    # O* a+ l; t. Z                //Method - 1  N=100000 247s  9 l$ n, b5 y$ f) T3 i) ?6 t+ J; S
                    //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
    ) I+ _( R! x! W' a" t, V+ ?3 s                                2 |+ p( k( ~! I5 S+ X4 m
                    //Method - 2  N=100000  237s, j) c4 n* e: ^& C& L5 d
                    /*$ N4 n1 q0 r: [" a& {& @0 A0 J/ w, n
                    for (int jj = 0; jj < N ; jj++)
    5 a$ J" g. A! N                {
    4 \5 _: W2 Q' \5 D- C7 _( o                        fresult += vec1[jj] * vec2[jj];( o& q) H5 h, h4 `6 N
                    }
    ' V! G) q  |3 s! y% Y- e3 u* T3 o$ ^                */# d+ r7 z/ ?" j% o9 q( g$ i8 w
                                    
    $ T8 ~9 V" W' I, T, L7 s7 s0 \                //Method - 3  N=100000 204s
    $ p: N3 f+ D( r1 A0 g                /*. j- N& a8 |+ B5 e$ e# `
                    for (int jj = 0; jj < N; jj++)
    ! K2 x  Z7 z5 x5 }$ w! L                {! [8 R- O" |# L' _" l
                            fresult += b1[jj] * b2[jj];
    ; {: n! g1 H/ j& x( M  ~                }
    0 m9 Q. o+ W& d0 n                */
    9 k+ R- a5 p6 T
    % D7 N1 i4 Y, }0 B                //Method - 4   202s; u7 F3 `* _2 K6 q3 b0 W
                    /*6 E# }# a$ O. P8 h
                    for (int jj = 0; jj < N; jj++)
    0 K* b0 o) I6 ]; X7 J# a- l                {9 {9 M) f$ l* @; o" B
                            
    1 d/ Z; n9 l. J                }' n3 T5 Q: p, a' ?
                    */
    " `5 x: z9 L6 b0 D8 z                //comment out all methods, N=100000  202s                6 n9 I- A7 F# A# s
            }4 a  s: u" y0 B: X4 |
    + v0 O# n. G' C# l8 S
            delete []b1;) c( x' g9 c5 K. S3 U  Y1 q$ a
            delete []b2;
    + J1 e9 R9 F) r8 i( Z, Z
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    16#
    发表于 2022-9-27 00:15:38 | 只看该作者
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?% L3 a* T; c0 i& o/ D) q

    * e! U* h! F6 p你第二个试验里面的j在循环里面又重新定义了啊,你确定真的跑了6000次?# r* E& o' P' |' ?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    17#
     楼主| 发表于 2022-9-27 01:16:03 | 只看该作者
    机器猫 发表于 2022-9-27 00:15
    # O& N$ \, c& }瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?
    ' |6 I8 j4 e" s. t( u$ C7 ]) Q* M; ^1 o7 {) w  r1 Z6 [
    你第二个试验里面的j在循环里面又重新定义 ...
    0 D9 g5 Y1 K, {5 X1 S& E
    内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL
    ; L9 M- t& m1 {3 o6 D6 |6 ?( V( M3 v
    不和它较劲了,瞎耽误工夫,我已经转到 ubuntu, 也准备顺便试试 avx2 向量化。
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    18#
    发表于 2022-9-27 02:06:58 | 只看该作者
    雷达 发表于 2022-9-27 01:16$ ^6 u/ y1 W& @) H
    内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL" F9 w6 Y- {- Y( v  w
    ) ^0 F7 {' Z$ ]  N" _
    不和它 ...

    2 M# Z* q: N3 s) r! j7 n
    1 m4 r# e3 I3 g8 q* o不过可以试试我说的register变量。前一个试验j是混在一堆其它变量里一起定义的,很有可能是在stack上,这样内存读写会更多,要是再碰上每次都需要加载cache就更慢了。
      f* L9 t# B( J. \4 N5 W  m后面一个是在循环那里定义的,说不定编译器就把它优化成register变量了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

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

    使用道具 举报

    该用户从未签到

    20#
    发表于 2022-9-27 20:29:50 | 只看该作者
    雷达 发表于 2022-9-24 23:54
    - U* A) A8 _, |% @+ q6 l( r1 Gvoid xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    . s. x% I4 G( Y. b+ q+ E1 K{
    / s5 j, w9 w2 a. J# n        comp temp, xtimesy;
    ( g4 k' }, T; ^0 s2 J# m$ o- C
    这个code里面如果Openmp没有被注释掉的话,那么temp那个变量应该是定义在循环里面,否则线程之间会存在争夺写入那个temp的风险。
    1 h7 J3 _* x$ O9 @- H内层for循环如果没有内部操作的话,编译时应该被优化掉了,和你完全注册掉整个循环是一回事。可能你的编译设置没有打开优化?! |+ C( |/ W8 S  o
    VS社区版没有问题,我工作用的就是社区版,设置正常的话不会比商业版差。以前游说头头用Intel Compiler,他说不想花钱,而且差不了多少,就一直用到现在。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2025-12-4 06:20 , Processed in 0.039997 second(s), 19 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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