设为首页收藏本站

爱吱声

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

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2022-9-24 22:54:26 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
    C++ 比 Octave 慢好多,怎么破?
    ! g( Y/ K$ L3 \3 K* r( L  K
    ( o5 x0 R3 e/ s  q自相关两层循环,内层循环涉及浮点数计算,试验了一下把内层循环内部全都 comment out 只留个壳子,  但空的内层循环本身就把速度拉下来了,看来问题并不在浮点计算。: J) j) L2 U8 I" \% ~0 ~9 Y" W0 u6 I

    0 F2 e$ K6 h& N速度优化问题真的很有意思啊。
    9 u1 \, u# u/ Z8 F7 P9 s/ v8 R7 W' K1 ]
    欢迎大家继续讨论

    评分

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

    查看全部评分

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

    [LV.Master]无

    沙发
    发表于 2022-9-24 23:04:16 | 只看该作者
    拉下来?拉多少?
    ( I, M/ z- d5 z/ J) i. k, h把代码贴上来看看?# B9 t- J& `" k; Q

    ( y' ^3 q# t1 i% ]" M8 J难道分支预测不准破坏流水线执行?不该啊。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    板凳
    发表于 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 编辑
    % c' `2 Z+ p. J+ j4 p$ k; \
    数值分析 发表于 2022-9-24 23:044 j* f  B7 B0 H8 I" D4 h$ l
    拉下来?拉多少?# l) Y4 U# w0 u7 t) i- D7 q  O. s  V+ t
    把代码贴上来看看?
    % }& x8 l5 v& {6 D7 B, {

    9 a" L) ?' \  l) u8 o4 Z' zvoid xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)5 t" {  K$ T7 _, S  E
    {
    8 \* i/ s% x4 V9 ?+ c( Z5 P        comp temp, xtimesy;
    ( J" l! ?0 A: @( ~4 x4 n        xtimesy.re = 0;
    ! e& x& i& f: N, @5 X9 l- ~        xtimesy.im = 0;
    * P( D+ y) h2 Y( j% A# k5 i        int j0 = lenB - 1;
    3 V; D' a' _* u  i: I' Q/ L0 q- _5 v        int    i, j, i1, reali;7 |: o) X6 _6 F+ b! X! v5 Z
            if (lenA % 2 == 1)
    & `% ]3 @; x! t5 i                reali = lenA + 1;: G1 e' e+ r: D# `' }9 U4 G0 _
            else& z' R/ i# l% B' H* ?, H6 l8 o
                    reali = lenA;
    4 \8 z4 x0 C) S" `- K& E% B        reali /= 2;
    . _% T, G; C0 {; A; T7 I* a+ `3 g
            int nconv = reali + lenB;1 o" u$ `8 k* L) S8 D
            //#pragma omp parallel for  j1 \! f5 P: V; n( G& c7 W/ M
            for (i = reali; i < nconv; i++)
    ( {  {6 ]2 g; n        {  x; ~; m- s* H2 C% W
                    temp.re = 0;) t6 L- \% _! ~8 Q" L6 Y( N
                    temp.im = 0;
    2 {4 F6 ]8 r; e* d% h( T& w' p0 K                i1 = i;  |/ U2 R  E3 {* N
                    for (j = j0; j >= 0; j--)8 z4 Q& @) [* _/ S& K0 w" Z0 l
                    {5 C9 U* ~  Z, F
                            /* floating date operation */1 D, \. X! b0 U! N
                    }
    9 z6 z5 j# ~5 @( n) n
            }! v1 }( t8 q4 I" j) N* z/ L( q
    }% D& {) m& K4 m" l) N, p
    : L/ H9 l6 H6 C& i: A0 T; C
    xcorr函数代码如上,comp是复数struct, 做过长度为11、19两个矢量的测试,和octave结果完全一样9 B- U: M9 i* k' b/ e2 Y- S- \
      {: o! N) f" ~% o$ O( h- q, @
    红色部分是内循环,现在其内部操作都comment out 了, j0大概是 6000。7 t7 P. z5 C/ c. y8 k  f4 i4 h
    现在call xcorr 100次,耗时78s.- ?$ k8 q8 l8 |# ]8 D% c, M- C7 N

    ; S) z- Z3 K8 ?4 Z6 T: r% e) G如果把红色部分内循环本身完全comment out, call xcorr 1000次,耗时 <1s.
    3 N5 t' v5 b0 u- B% X3 M, f4 H6 f& N
    9 Q" X8 w/ I& g! y) F4 @6 h
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    6#
     楼主| 发表于 2022-9-25 00:17:17 | 只看该作者
    风雨无阻 发表于 2022-9-24 23:33$ |& Q3 p& L& \8 \
    Maybe Debug mode?
    0 H0 N, u) O+ G3 T) f" |

    - a; I- c( J+ J5 E不应该,看我上面的回复。
    ; e; h$ t  l' |8 \5 p, L6 k" i6 d" W1 n
    4 v6 f" o$ A9 J6 Y4 C我更怀疑是 VS 社区版的问题
    回复 支持 反对

    使用道具 举报

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

    [LV.Master]无

    7#
    发表于 2022-9-25 00:20:10 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 00:24 编辑   x2 ?+ ?! T! _
    雷达 发表于 2022-9-24 23:54
    9 X8 y' U) L$ X0 W+ G. \* F9 lvoid xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB). B, m8 Z) D4 H% d1 [0 ]. ?8 ^
    {* N9 }9 N$ ]" V/ {! A
            comp temp, xtimesy;
    - |  v5 r; ^0 R

    , r; J3 [8 K& J9 c; E  M这个不是这么比的吧。。。& g5 f0 W$ ?% E

    % c: _; }# @$ _; l# }+ s* X您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    " Z% }* ?, ]. P1 K
    ; J6 H1 \+ ]; s; r; O而加上内循环,光jmp和dec指令就至少多执行了6000个,慢个几十倍不是正常的么?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    8#
     楼主| 发表于 2022-9-25 00:46:56 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 01:09 编辑 : C8 [' Y" t% a
    数值分析 发表于 2022-9-25 00:20
    9 U6 Z. Q! M) v2 ?% ?, l% q" }' L这个不是这么比的吧。。。5 f" b  m3 [4 z- v9 W  U
    & H0 }- n4 c; P& e- ?4 a7 F
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。

    - R# o: x7 p9 |8 P: [. A" m9 \* U' J& I1 M6 i: Z
    有道理。4 b: k7 K/ @5 y4 o# d0 m
    所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,记得 numeric 库里有算向量内积的,我回头试试。
    . D  A' P8 I" j9 |+ I6 u. O
    9 R) x0 B7 ^0 w+ f6 p- Z' z我先尝试尽量用标准库,一个小程序,不想搞得太复杂。多谢了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    9#
    发表于 2022-9-25 01:27:53 | 只看该作者
    雷达 发表于 2022-9-25 00:46
    6 r. z5 T, _4 V: |3 B: y3 A8 f有道理。
    * _3 r6 C  F( H3 d8 D; ^, {所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,这大 ...

    1 T# ^) l7 }0 V你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子,把循环本身翻译成机器指令loop或dec/jnz,两者速度上会差很多
    % S6 ?! i% p: h" }, C$ |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$ Q( Y0 b' O+ I4 d! c# z
    这个不是这么比的吧。。。# O& h' J1 y* q* @2 {6 \
    % e; [$ I! s( X: h" j3 W( ^- F  M
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    而加上内循环,光jmp和dec指令就至少多执行了6000个
    ; X6 I# _0 T5 x2 {

    + \# a; O2 _) V3 v: v现在的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 编辑 . u$ |4 x& K: N( s
    沉宝 发表于 2022-9-25 01:48: {. w7 i3 v# z& a
    现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果 ...

    - Q! b2 M. B. Q- u3 H
    # E6 U3 W5 k8 ?2 z$ t7 q是的,兄台说的对。: ^# v; G$ f  T  D

    / V7 X7 h% u1 z6 q: [2 B/ h1 G其实我想说的是 真正数值计算部分和代码中其他不直接计算的overhead的比值这个事儿。
    - l/ ]2 p2 t" s( s0 D1 j+ m
      S: B) J8 _) o) V* M  ~; g9 q雷达兄构造测试用例的时候,屏蔽掉了所有计算的部分,使得剩下的都是overhead,这样run time比较的结果就显得好像不合理了。如果把计算加回去,计算部分的run time会dominate,结果就不那么离谱了。因为不好说,所以用指令数对比的方式试图直观地说明这一点。" t, |6 [' X- T1 X2 L
    ! C4 o; q* z, J# ]3 i# _: G. J
    比如说,如果有计算,那么跑六千个循环相对于计算应该用不了多少时间。但是如果一边是什么都不做,另一边是六千个循环,那六千个循环比什么都不做慢几十倍了,就不是那么不合理了。) {$ |# R* q7 r( d& p
    3 |  y2 z( v+ T+ Q
    当然也有可能像兄台说的,是优化参数的问题,但我觉得更多地是测试用例设计的不合理。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    12#
     楼主| 发表于 2022-9-25 04:47:43 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 04:49 编辑 2 M0 t# w9 b: J) v2 K$ \3 {
    沉宝 发表于 2022-9-25 01:27+ L, H. q1 {8 f5 a* z6 x
    你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子 ...

    ! p3 V: D8 `; |# O; s& }9 C! |0 n0 O) B- ^4 k2 s7 q
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差一倍,我上面这个差的太多了。
    4 i6 C5 q/ B2 g5 E& S) w5 J
    : ?, D. V3 K' D2 d我已经完全懵了。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    13#
    发表于 2022-9-25 05:51:23 | 只看该作者
    雷达 发表于 2022-9-25 04:47
    3 J  U  T# ^3 o$ ^5 }又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...
    5 q3 ~, M0 v* N* c- d3 p
    时间差一倍的结果可以接受。
    7 Z& J( C4 Y& C) @7 M: m
    ( N0 _# G7 g2 a) G8 H7 ~你还是用profile工具看看吧。现在大家都主观瞎猜。
    回复 支持 反对

    使用道具 举报

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

    [LV.Master]无

    14#
    发表于 2022-9-25 14:58:59 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 15:38 编辑 ! P& |1 z3 d8 r$ a# S
    雷达 发表于 2022-9-25 04:47
    ; {1 B4 M" A. |, V又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...
    # J: e8 p& |- I1 m
    $ ]' q; X8 {1 c
    9 s3 s7 s0 b8 H3 D4 _" F3 z" O

    1 _7 c6 I9 s+ d9 e( g. R" D, ?能不能把这个也贴上来,看看和上一个有什么不同?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    15#
     楼主| 发表于 2022-9-26 01:30:03 | 只看该作者
    本帖最后由 雷达 于 2022-9-27 01:17 编辑   r" s% O* F/ |3 c# Y2 D1 ]
    数值分析 发表于 2022-9-25 14:58
    ( ?8 S$ I$ ^6 B! M) C能不能把这个也贴上来,看看和上一个有什么不同?
    . A& k0 w5 \2 V" w( m7 U- R
    理了理思路,重新做了一个测试。  V7 h# w# P. k0 N
    做了两个 vector 和 两个 float *, 都长 100000
    5 d+ ^& G7 J/ ]6 g  O$ s外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
    3 t7 U- }  I! L- m! g" z% {, @2 g+ [# }
    内循环试了4种方法,
    9 F  o- H; u2 ?& t: N2 W1 m1. 直接调用 vector inner_product 247s
    0 I+ q/ u0 c) B: g2. vector 循环点乘累加 237s
    5 s' ]" r, I  f4 L" ]2 ]3. float * 循环点乘累加 204s
    # `# w8 a% L8 I; a& k  d# L/ u4. 空循环 100000 次 202s: x3 Q1 I% @2 }' X
    . ]( m8 I- O8 l( y4 R" z* \
    不做内循环 200s' y, v) }9 i2 g/ {& g% g
    , y4 B+ P1 g) Y* I) @
    你昨天说的对,内循环本身占比是很小的,大头在其他处理。
    - `" r' O" u8 ]' S另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。5 O3 V7 a$ L3 e$ l1 \, o5 `

    / S/ L( W0 v% U3 a7 z至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)- F' D0 y5 ^; e. ]: K/ `! S! ]
    8 T% |8 _; d/ w# _9 O
    (为什么下面我贴的  b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成  jj 好了,原来 方括号里的 i 是斜体标志  LOL)- f: c! u8 g, o+ I

    ; Q* {- ~, ^" O- v& \
            std::vector < float > vec1(N);
    2 k$ o2 U, K! |* w# f        std::vector < float > vec2(N);& Z% Z% H  @) o, h# ^3 L
            float* b1 = new float[N];3 O# x, P' d( v
            float* b2 = new float[N];  P; L4 V3 g) [* L
    3 C9 U5 z8 a/ `' W0 n
            for (int j = 0; j < 6000; j++)
    % H4 Z# Y" T  j, q( ?        {% v2 g( p( o/ o2 V( o
                    std::generate(vec1.begin(), vec1.end(), []() {8 Q- g3 ^( a" @% f. r* L9 M: h
                            return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
    , t1 {: f# p9 b. n                        });
      h0 A& g# {4 H2 o/ I
    & k) \' E0 S" R# f/ h4 W                std::generate(vec2.begin(), vec2.end(), []() {
    : I9 E9 E) T0 t& S& Y, \                        return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;+ Y; \( |1 G/ h1 C3 \  y2 u
                            });1 ^; }$ R) g/ U6 N/ s' F
      K6 P  ]# {" ^+ ?' _
                    for (size_t jj = 0; jj < vec1.size(); jj++)
    # t5 i1 i( B2 {$ C! m9 ?                {+ q: @/ k  m- x$ S( V' |! m: Z
                            b1[jj] = vec1[jj];
    $ S7 a8 l2 \* Y0 a& q. @                }/ I/ W" R8 u1 p4 ]/ \3 i& M0 {

    0 j% K0 N, q! ?6 g7 u1 w7 a2 p2 X                for (size_t jj = 0; jj < vec2.size(); jj++)
    ' N7 e2 C% k+ Z* e) c# X                {) Z* H# s! g6 J: x* _$ I
                            b2[jj] = vec2[jj];
    3 C; I# j0 h) c8 f                }+ ^9 Y% |1 F6 a. P
    6 {8 B: Y  N6 ^* e
                    //Method - 1  N=100000 247s  ! @4 z# L  j! m8 ^; F/ r
                    //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);  F4 ~+ O& f, x0 ?
                                    
    : s6 a2 p( u" T" {4 g                //Method - 2  N=100000  237s' n% a$ ]* O8 `! Q
                    /*
    ( ]; W4 D5 m+ \7 m* s/ m                for (int jj = 0; jj < N ; jj++)
    ! G1 N3 N) o; c) f0 f3 X                {
    8 C% t; a7 ^1 @- X, M                        fresult += vec1[jj] * vec2[jj];# t2 P$ Q* L/ J# ]' S, D
                    }9 c: g, c( C9 ]' ?$ v2 L7 Z8 o3 E
                    */
    2 e& ?) r( r# N( j2 B6 v) o                                
    3 x2 u1 o! x1 j4 L* Y6 L+ m                //Method - 3  N=100000 204s
    ! l# u2 c/ ]/ o4 S                /*% f  ?! E0 L! ?! k5 s$ k
                    for (int jj = 0; jj < N; jj++): q9 f7 ~; O" `$ X: y) o
                    {
    - k$ [& m/ M" {3 a& h8 N5 `3 R                        fresult += b1[jj] * b2[jj];7 _; m! w, w8 O& q' [+ P8 q
                    }
    3 s6 p- c& V2 r  @' i                */
    ; i' h& h& i% Q& w! L8 A% @
    3 a" {( y, g- m1 J* C+ d0 |% S                //Method - 4   202s
    % E5 {  s. b) b! M* \- U                /*2 p  `+ q; p# r& E
                    for (int jj = 0; jj < N; jj++)
    1 X8 W0 p$ o; w) W) p, X- s0 {                {
    5 T9 ]  m- Z/ o2 f) K" m* ?                        
    ; T+ T& Y, R- Y  z) V  ?5 v2 q9 G$ ~                }
    0 D- g+ g  f: p9 }7 Q                */
    : i& Q- d9 U. x9 s# B4 ^, \                //comment out all methods, N=100000  202s                & Y0 }8 O' }4 ~" g
            }* D* m  ^' t7 c7 ~( b

    ! g! p- k) w( B9 n& R  ~0 Q9 n        delete []b1;4 [( K* `" u1 _; }) d. ]9 m; t
            delete []b2;
    : C3 V9 T7 j* f, p& K# _8 P0 V
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    16#
    发表于 2022-9-27 00:15:38 | 只看该作者
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?1 e0 O7 _6 n  e+ j! h7 ^$ A

      r" ?: A- A8 Y0 f; l你第二个试验里面的j在循环里面又重新定义了啊,你确定真的跑了6000次?# F* j; e- `* A( ~+ E
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    17#
     楼主| 发表于 2022-9-27 01:16:03 | 只看该作者
    机器猫 发表于 2022-9-27 00:15
    + j1 A) w( c6 a; S3 P+ f- p瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?! H! e) L4 W  C3 t

    * o/ {$ \/ l6 U! j- b8 K你第二个试验里面的j在循环里面又重新定义 ...

    $ G# ]3 B. T% H1 S; u内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL
    : h. {- }& t( ?$ \
    - T8 r- A* n' o8 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 {* }5 s4 J4 i: w内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL2 w1 Z+ I# I& }4 U
    7 C/ s9 r/ r$ L
    不和它 ...
    + q$ O& h1 x6 E3 ?1 Q6 c4 v) |/ U( e" I

    2 R  P! u$ s. g) F+ y" U7 A+ w- Z不过可以试试我说的register变量。前一个试验j是混在一堆其它变量里一起定义的,很有可能是在stack上,这样内存读写会更多,要是再碰上每次都需要加载cache就更慢了。
    # V- Y* v; d' k" U+ B后面一个是在循环那里定义的,说不定编译器就把它优化成register变量了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

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

    使用道具 举报

    该用户从未签到

    20#
    发表于 2022-9-27 20:29:50 | 只看该作者
    雷达 发表于 2022-9-24 23:54: a( e# `# h3 ]! @/ o0 b2 ?! I
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB): i# j! k7 Z$ ~5 ?  a) b
    {$ O* G3 l4 j" I' j; v/ j4 E) T
            comp temp, xtimesy;
    : `% X+ W9 o" t/ X9 }% ]5 @
    这个code里面如果Openmp没有被注释掉的话,那么temp那个变量应该是定义在循环里面,否则线程之间会存在争夺写入那个temp的风险。5 f* B9 j; {2 G# I( r
    内层for循环如果没有内部操作的话,编译时应该被优化掉了,和你完全注册掉整个循环是一回事。可能你的编译设置没有打开优化?
    , W+ o: @& ^8 a3 _VS社区版没有问题,我工作用的就是社区版,设置正常的话不会比商业版差。以前游说头头用Intel Compiler,他说不想花钱,而且差不了多少,就一直用到现在。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2026-6-16 11:30 , Processed in 0.066017 second(s), 19 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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