设为首页收藏本站

爱吱声

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

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2022-9-24 22:54:26 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
    C++ 比 Octave 慢好多,怎么破?1 r4 s0 ~* w/ q' K* x
    / o& l7 [$ ]- N1 i& [7 N* D/ c: ]
    自相关两层循环,内层循环涉及浮点数计算,试验了一下把内层循环内部全都 comment out 只留个壳子,  但空的内层循环本身就把速度拉下来了,看来问题并不在浮点计算。
    6 C# e7 x' m9 |: j3 E' i1 p
      f$ ?* K9 F& p速度优化问题真的很有意思啊。
    - T8 y- }+ h* D, y  Y/ b+ g& D2 p. o* Y
    欢迎大家继续讨论

    评分

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

    查看全部评分

  • TA的每日心情
    开心
    2025-12-26 03:23
  • 签到天数: 1954 天

    [LV.Master]无

    沙发
    发表于 2022-9-24 23:04:16 | 只看该作者
    拉下来?拉多少?% H7 }! D; `. S9 K" k: O
    把代码贴上来看看?% n( w4 L2 i  S1 N7 z0 ^+ i
    5 V" t. E6 N! t& J3 ~/ U& A
    难道分支预测不准破坏流水线执行?不该啊。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    板凳
    发表于 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 编辑 9 N% r" s% v1 `( N0 j7 T
    数值分析 发表于 2022-9-24 23:04# p$ ~; P( x9 g: d  _! ^; i
    拉下来?拉多少?
    1 O1 B8 K  E2 P4 V3 z6 ]( l把代码贴上来看看?
    9 R2 [4 y- ?; N$ |' w' [1 Z  d
    ( g6 B6 l, {  h( _
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)* l: o0 d+ a/ N4 r6 w
    {- o/ q# S  G! Q
            comp temp, xtimesy;
    / q' Z* \0 P8 Y; k        xtimesy.re = 0;- l! i& \% x  A* N+ T) M& O5 k( z1 q
            xtimesy.im = 0;
    * _  Z& n+ M7 |. G        int j0 = lenB - 1;
    . O+ f1 A2 q: F+ _* O        int    i, j, i1, reali;
    + W0 U3 H# c* e; X% i$ o- G# [3 e& y        if (lenA % 2 == 1)7 H) q" _6 u4 r- _
                    reali = lenA + 1;4 K- u1 [0 u9 ~
            else
    6 @6 Z& U; a$ Q7 {: A3 g                reali = lenA;. y4 R. c5 }7 W5 }
            reali /= 2;4 C9 t" w" _. f7 |9 v8 T
    , n6 m3 y+ b! N: Z0 u% r3 I( t/ C
            int nconv = reali + lenB;
    ' i/ X/ ~9 b+ g* g7 c        //#pragma omp parallel for
    ; r% T; `2 `  i! W        for (i = reali; i < nconv; i++); ?. X6 f( E9 f6 q3 ^
            {
    4 q. m. F9 l3 Y& J8 u4 M                temp.re = 0;
    9 o5 G3 I4 j# K% r" m! q; G                temp.im = 0;' i$ W0 t4 [2 B' ]/ v5 G% ^3 s
                    i1 = i;9 Q; ^" K! p7 |$ R: f
                    for (j = j0; j >= 0; j--)' h' U* Q3 ^1 M
                    {
    * f  ~' I$ l, N/ }1 y0 Z# K3 [                        /* floating date operation */, n/ H0 ^  ]. M+ _" g' n
                    }
    9 ?* t& x1 P) V
            }
    ! w- i( I6 l- }1 m2 Y}
    - A9 ~+ Q$ g* {( k" E
    3 h8 l" H# N. w% Q- Cxcorr函数代码如上,comp是复数struct, 做过长度为11、19两个矢量的测试,和octave结果完全一样
    3 t2 t! Z. I% c* a* K' p  `0 l$ |( s2 s% H1 B  [1 m
    红色部分是内循环,现在其内部操作都comment out 了, j0大概是 6000。' y8 ~* `2 I' A1 @  O  f
    现在call xcorr 100次,耗时78s.
    ) k: `1 i! y0 @+ |
    4 P+ r" O& f& s# L如果把红色部分内循环本身完全comment out, call xcorr 1000次,耗时 <1s. : l7 e) q1 Y9 I$ o4 g
    0 c& ]' Q9 c' R
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    6#
     楼主| 发表于 2022-9-25 00:17:17 | 只看该作者
    风雨无阻 发表于 2022-9-24 23:332 ?$ y% d7 B4 b) t
    Maybe Debug mode?

    " w: r) f/ W, j: l- C* [
    ! v" S% N) g5 Z3 ?0 u5 o6 F# C不应该,看我上面的回复。+ l, A" x8 H" ]% m3 R
    " E% F' u; c' t6 M, |* T, L
    我更怀疑是 VS 社区版的问题
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2025-12-26 03:23
  • 签到天数: 1954 天

    [LV.Master]无

    7#
    发表于 2022-9-25 00:20:10 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 00:24 编辑
    % k9 q' n% C, ]6 a8 s! q. U
    雷达 发表于 2022-9-24 23:54
    ' S5 `3 _( J% z( f9 b! Vvoid xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    8 ?* C% |' ]9 M; M/ E% U2 }2 T{
    ; {% Z) ]( O! q6 n4 o# z        comp temp, xtimesy;
    1 m" D7 C" M1 B7 c
    9 s3 P. A$ X0 E% k
    这个不是这么比的吧。。。4 {7 K* S. O  g5 t* n3 U8 H

    + G) U" q6 Z! P; l. O您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    * X4 G9 Y( m0 n' C% p1 K# v1 ?( J/ D  `! `/ X8 t1 V$ G0 Y
    而加上内循环,光jmp和dec指令就至少多执行了6000个,慢个几十倍不是正常的么?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    8#
     楼主| 发表于 2022-9-25 00:46:56 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 01:09 编辑 ; L7 Z2 a( T% V, s6 q! l
    数值分析 发表于 2022-9-25 00:20
    - ?  v+ T- X' c( D; n; v这个不是这么比的吧。。。
    7 ]9 q2 k/ `; v: C) }4 h4 V2 r% y, V6 G5 `) s
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    * G- {  ]/ Q8 Z

    & \3 `3 ?- ]6 ~9 }有道理。: x) }, S& B, u8 L, v) V
    所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,记得 numeric 库里有算向量内积的,我回头试试。
    * I1 d+ _1 i* f8 I
    ; V$ e$ l. K! E: @1 J) z& B我先尝试尽量用标准库,一个小程序,不想搞得太复杂。多谢了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    9#
    发表于 2022-9-25 01:27:53 | 只看该作者
    雷达 发表于 2022-9-25 00:46# J, y3 c) @2 o  T* s/ w
    有道理。
    6 i, B# u. r$ }  ^  i  n! Q所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,这大 ...

    : P' V2 a: v! f/ g你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子,把循环本身翻译成机器指令loop或dec/jnz,两者速度上会差很多
    ' G8 c& {5 o4 \+ j# p: ]) a6 ~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
    6 |1 }8 Q# `$ }) U. @这个不是这么比的吧。。。
    8 z4 L: r( t) H/ I% Z: v2 t9 `% @" u0 S3 G$ i9 p/ D% i
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    而加上内循环,光jmp和dec指令就至少多执行了6000个

    5 i4 i5 c" G9 \4 G- |: ?  Y1 x; t1 m) |
    现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果循环这样跑,花不了多少时间。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2025-12-26 03:23
  • 签到天数: 1954 天

    [LV.Master]无

    11#
    发表于 2022-9-25 02:06:44 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 02:16 编辑
    ) Q! r1 i. b8 R' g% W
    沉宝 发表于 2022-9-25 01:48
    + ]# H( o9 F/ e; J3 I" g# M. d现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果 ...
    . `9 O. Z/ G: {; f- R, Z* x0 E# _
    & F. s4 g  B" P2 V0 M, i& w$ ]
    是的,兄台说的对。
    6 r' Z4 C( i# P; X. k& |$ j8 E6 f. h, B! P( K: K
    其实我想说的是 真正数值计算部分和代码中其他不直接计算的overhead的比值这个事儿。
    1 y% ]! {! W9 m# q: Z9 H7 U! q3 p. `& z- e8 Y* G! o' a% W! |& ^/ n
    雷达兄构造测试用例的时候,屏蔽掉了所有计算的部分,使得剩下的都是overhead,这样run time比较的结果就显得好像不合理了。如果把计算加回去,计算部分的run time会dominate,结果就不那么离谱了。因为不好说,所以用指令数对比的方式试图直观地说明这一点。+ e/ G3 I0 e& n* E+ h2 @, m

    : p9 Z- v; H: O; c比如说,如果有计算,那么跑六千个循环相对于计算应该用不了多少时间。但是如果一边是什么都不做,另一边是六千个循环,那六千个循环比什么都不做慢几十倍了,就不是那么不合理了。
      `) p: h; l/ o
    $ t1 O0 Z) e' |4 C0 d" `, \当然也有可能像兄台说的,是优化参数的问题,但我觉得更多地是测试用例设计的不合理。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    12#
     楼主| 发表于 2022-9-25 04:47:43 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 04:49 编辑 4 B) d! |) G$ p  {' ~' O8 B
    沉宝 发表于 2022-9-25 01:27
    ' H+ s0 S, \* E. D3 @- A+ @你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子 ...
    + d$ s5 e0 D+ j" d

    ; C' [8 ?6 ^+ a! L) K, [7 f0 R' R, r又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差一倍,我上面这个差的太多了。
    / {% Y0 J- r8 F5 O5 c7 @6 U5 m# W; N1 |2 U. c/ h9 P  O
    我已经完全懵了。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    13#
    发表于 2022-9-25 05:51:23 | 只看该作者
    雷达 发表于 2022-9-25 04:473 e2 Q! x+ d) T/ n5 \
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...

    - ]0 D0 h, Y' ^# n, ~  c/ ~时间差一倍的结果可以接受。9 K# S5 o) Q% C4 _1 r

    6 D! b5 W0 m' m, @你还是用profile工具看看吧。现在大家都主观瞎猜。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2025-12-26 03:23
  • 签到天数: 1954 天

    [LV.Master]无

    14#
    发表于 2022-9-25 14:58:59 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 15:38 编辑 2 i. X! P6 l( L9 A& X
    雷达 发表于 2022-9-25 04:47% @+ \1 F- }! W) B
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...
    $ x' v0 T. e# {" I( A6 O8 @
    " ]7 o6 e0 h1 x5 b  s! r

    & x5 S1 D5 L9 e2 J3 k) }' O2 z* o5 S- M4 {, b& `5 e/ c
    能不能把这个也贴上来,看看和上一个有什么不同?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    15#
     楼主| 发表于 2022-9-26 01:30:03 | 只看该作者
    本帖最后由 雷达 于 2022-9-27 01:17 编辑
    . R! i; M' K, y2 c! V' @
    数值分析 发表于 2022-9-25 14:58
    . k4 t, k" g3 z2 w2 _7 s, u2 s能不能把这个也贴上来,看看和上一个有什么不同?
    0 P$ t/ M9 E. f
    理了理思路,重新做了一个测试。
    , @1 X9 P$ f& t% B, J5 G( l做了两个 vector 和 两个 float *, 都长 100000
    3 Z1 b  d+ q* A& L/ N( a外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
    ) K5 L1 p7 `4 i/ }0 M( V; b% u
    3 A1 X3 W3 M2 b  y内循环试了4种方法,  s! i: I, ]% I+ R4 M6 U0 X* c1 p! I
    1. 直接调用 vector inner_product 247s
    8 o, R+ _/ N8 Y8 M1 M3 E0 Z2. vector 循环点乘累加 237s
    2 G% [6 }4 a0 o' W; J2 V3. float * 循环点乘累加 204s$ K' {, d6 |0 v  q" e" H& \% v
    4. 空循环 100000 次 202s
      z( a! e0 {# o9 G' H4 ?, c$ D4 F
    5 I  G6 F* l, R# C+ b% c0 F' G" P不做内循环 200s. i" r) H! Z# A/ W3 {$ J/ i& O
    - E7 |# M2 o8 d, R3 s+ H
    你昨天说的对,内循环本身占比是很小的,大头在其他处理。( _' e- C$ m, f* Z: `9 N
    另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。; e; F( _" \4 r% Q. C+ Z

    # A' x, l( b  {: P! D9 S9 T! {1 v4 b至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)* b7 `/ M' H: |' E2 P% Z

    4 t: ?) x4 x/ c+ `0 k* H" ~(为什么下面我贴的  b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成  jj 好了,原来 方括号里的 i 是斜体标志  LOL)% m: \" w5 g$ J2 y/ x$ x9 K# }' l) ^
    4 H* n" L2 y) C0 @
            std::vector < float > vec1(N);+ W0 |7 B' v% a7 ~% t, a
            std::vector < float > vec2(N);( S6 k0 T& Y. a! N9 F8 I
            float* b1 = new float[N];$ M1 R4 N7 W4 d" k, W$ B; a: [% M
            float* b2 = new float[N];
    + }* U2 z) d/ C2 p( S+ b/ P  U+ @$ L1 R' I, X' ^
            for (int j = 0; j < 6000; j++)
    4 u9 ?; \' t  O9 F  `, ~) u        {
      @% S6 j+ w) e$ g                std::generate(vec1.begin(), vec1.end(), []() {6 R$ l4 G( J6 ]" `% T& K
                            return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
      V6 [9 g3 C) R* N                        });
    # D: l1 y7 p% B( P" ^" U2 M% H/ z9 B! z
                    std::generate(vec2.begin(), vec2.end(), []() {; d. O  n  Q6 E' \$ Q
                            return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;5 s1 y- n- K+ j1 [- o
                            });
    " h+ `& R! K; K. M2 L& O
      @# x4 V4 f9 W3 m/ u                for (size_t jj = 0; jj < vec1.size(); jj++): x2 @$ ]# I# h+ a# J+ [, Q  a
                    {
    4 ]* S3 l' `/ i6 M) o5 {                        b1[jj] = vec1[jj];
    % d: f9 l5 ]7 {+ f: B7 F                }0 r, t- R4 f$ p" z2 u6 N
    : H% e9 i: b0 P; V7 ]' P
                    for (size_t jj = 0; jj < vec2.size(); jj++)2 E* s, f# E% D/ U2 ?' h: c; q& w
                    {# c1 [6 l5 Y: A1 L8 J9 f" o
                            b2[jj] = vec2[jj];' k) e* p) u+ P/ J9 F
                    }
    3 K, v4 k8 S: S. i# i; x. C2 P" j7 g% B( }4 G$ j7 O, [
                    //Method - 1  N=100000 247s  7 j% ]+ G7 q+ }
                    //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
    6 o7 w! H, m. v& |5 ]6 \. `                                ' C' c1 ]2 Z- b8 D
                    //Method - 2  N=100000  237s
    : n5 v7 q6 K2 J3 a3 k                /*9 D9 }- \1 K4 f) v" C
                    for (int jj = 0; jj < N ; jj++)
    + c1 x% V8 j2 T( i$ t' }/ @; O                {+ @& p" L' n1 @3 b
                            fresult += vec1[jj] * vec2[jj];5 ?' ]( ], z) O; ?9 O  ]
                    }
    / }/ H  a; v; }& N8 Y/ F                */  \8 O  [. I' V+ {
                                    
    & h" @6 B4 [5 l- ^5 F                //Method - 3  N=100000 204s. M) a* n& R# K6 S$ E$ D
                    /*
    5 H& k* m6 J, q7 L2 M% I                for (int jj = 0; jj < N; jj++)
    8 a7 [4 B: ~' ]  |$ C                {/ v4 S7 A( E5 D
                            fresult += b1[jj] * b2[jj];
    3 ?# K2 Y+ B$ G" C+ K8 ?                }
    7 a1 V  v+ M$ K. @                */% D: u* ]2 p. C9 R) R
    ) _2 f! W6 V+ O8 O% d, u
                    //Method - 4   202s- E' O9 L3 A0 F
                    /*
    ; |7 ^# s! {3 R  }                for (int jj = 0; jj < N; jj++)
    7 [  _  _; V( q" g9 c1 T3 `                {
    : M! x$ u1 m5 T, _$ R4 r6 V                        
    & k* b1 a& d' N# a; }                }
    2 _" Z: i1 Z( [. M: {                */
    - X; p* D& B9 ]. }9 s                //comment out all methods, N=100000  202s               
    3 M; r# u8 f  {$ d        }
    % f1 {/ d% W, f5 U5 x8 \
    8 w! `( f/ h+ `3 w/ q        delete []b1;
    2 E. G2 P" ~3 @+ n% P2 I3 j        delete []b2;

    5 @" P, V0 o  z) u! t5 E$ {3 b
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    16#
    发表于 2022-9-27 00:15:38 | 只看该作者
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?
    & b5 A; W6 y; Z5 F1 J  r. {$ d
    / N5 `- s# ?+ k0 z* q& p( j, ~你第二个试验里面的j在循环里面又重新定义了啊,你确定真的跑了6000次?
    ( A: z4 Y& q. o4 i
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    17#
     楼主| 发表于 2022-9-27 01:16:03 | 只看该作者
    机器猫 发表于 2022-9-27 00:15+ ^+ m1 F1 o% c8 ]4 m) |4 M5 D
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?
    1 e0 g. I; W7 W2 i  r* j5 \" Z! I! v9 p( ]- t' q
    你第二个试验里面的j在循环里面又重新定义 ...

    , E. l1 x& \) h内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL9 X- R- m& S9 b4 e7 [0 k5 G5 k

    7 c9 q  U7 D! R0 T" x: M不和它较劲了,瞎耽误工夫,我已经转到 ubuntu, 也准备顺便试试 avx2 向量化。
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    18#
    发表于 2022-9-27 02:06:58 | 只看该作者
    雷达 发表于 2022-9-27 01:16. t: \- r# d5 ]( @7 q- ^  z2 Q
    内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL8 o  V. X/ ~" g( h$ f# l$ n. }

    ( k" H/ l* y% [4 A8 s; R' C不和它 ...

    5 ^) u* k/ O/ \* E  Q  ]3 a
    . S* J. X: g% u" z, v" h5 U) u: U2 m不过可以试试我说的register变量。前一个试验j是混在一堆其它变量里一起定义的,很有可能是在stack上,这样内存读写会更多,要是再碰上每次都需要加载cache就更慢了。
    - o" k8 m5 a* R  s  ^4 N后面一个是在循环那里定义的,说不定编译器就把它优化成register变量了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

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

    使用道具 举报

    该用户从未签到

    20#
    发表于 2022-9-27 20:29:50 | 只看该作者
    雷达 发表于 2022-9-24 23:54& h6 L; ^/ y% O* U8 \& ^) w
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    7 N9 m4 s3 ~7 O{
    . W" C; O* m& ~# w: c- e        comp temp, xtimesy;

    ! N9 h5 U3 \2 b4 t% N这个code里面如果Openmp没有被注释掉的话,那么temp那个变量应该是定义在循环里面,否则线程之间会存在争夺写入那个temp的风险。
    * c* o- C+ J3 v4 P- H内层for循环如果没有内部操作的话,编译时应该被优化掉了,和你完全注册掉整个循环是一回事。可能你的编译设置没有打开优化?/ G  l0 N1 z6 A5 M9 N2 g
    VS社区版没有问题,我工作用的就是社区版,设置正常的话不会比商业版差。以前游说头头用Intel Compiler,他说不想花钱,而且差不了多少,就一直用到现在。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2026-1-8 20:49 , Processed in 0.041379 second(s), 20 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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