设为首页收藏本站

爱吱声

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

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2022-9-24 22:54:26 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
    C++ 比 Octave 慢好多,怎么破?
    5 Y8 o2 T9 Q4 x& J% M) K) D* a) y# y4 ?
    自相关两层循环,内层循环涉及浮点数计算,试验了一下把内层循环内部全都 comment out 只留个壳子,  但空的内层循环本身就把速度拉下来了,看来问题并不在浮点计算。7 I# Q% P( K! j5 z( w: U; J' F  y( w
    7 Z* j& u% U: i; `( K
    速度优化问题真的很有意思啊。0 h0 p+ f- v) H# j1 ~
    : R% O1 s3 d+ p2 F8 j- C0 N
    欢迎大家继续讨论

    评分

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

    查看全部评分

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

    [LV.Master]无

    沙发
    发表于 2022-9-24 23:04:16 | 只看该作者
    拉下来?拉多少?
    / s6 d! E3 D, o# K* ], \把代码贴上来看看?
    / P& B: }5 t3 x9 J3 ^2 V! [( m" H9 H% p
    难道分支预测不准破坏流水线执行?不该啊。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    板凳
    发表于 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 编辑
    % [  F2 v( Q! ]4 }' E8 R
    数值分析 发表于 2022-9-24 23:04$ W' H0 }+ p# P
    拉下来?拉多少?
    # \; Z9 r" E5 p把代码贴上来看看?

    8 M+ f9 N/ n& M2 E2 C: v! u, v7 w% C( k( l( Q2 W$ {
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)2 ]/ U9 z  m2 M" ~8 M' B
    {1 R5 B$ K! e3 d2 y
            comp temp, xtimesy;
    ! {% `! o: \8 j; I( v6 P0 A( p        xtimesy.re = 0;. u! s: k  ~3 [, C/ k7 S! K$ k, k
            xtimesy.im = 0;& i" [0 q: ^4 V5 A4 i5 ^" O- l
            int j0 = lenB - 1;" k1 N: [+ J5 G' n7 s
            int    i, j, i1, reali;$ A9 W6 U$ X) b- u9 O5 `2 o' b
            if (lenA % 2 == 1)
    , E( t2 W; G0 J: v6 {0 }                reali = lenA + 1;# ?' W4 h7 F& M* t+ H% q* {
            else4 W; Z+ G9 c' R- [" F
                    reali = lenA;
    ( |( J/ i( }7 i- t: j6 Y. B  c        reali /= 2;
    4 C3 B" w5 \8 @* x! |% [: j: ]$ d8 l( |4 G
            int nconv = reali + lenB;
    / e1 H4 {& A9 @' O# M1 B* l        //#pragma omp parallel for
    - N0 L- Q% f0 B& T- M        for (i = reali; i < nconv; i++)
    + A" ~+ z( d5 c* e' q( @- L        {
    2 u) f1 h- h) c8 e/ O; S/ a                temp.re = 0;
    ) f* @: V, v  b( S9 A                temp.im = 0;
    / Z# w, f- `1 ~# f8 h/ H1 C                i1 = i;& w  c% a4 c0 L3 G% r+ Q3 A9 X
                    for (j = j0; j >= 0; j--)
    9 G% Z" n' i& J* r8 Q: V; y) C/ `! I                {8 c6 o; r* j. l" _- y6 Y
                            /* floating date operation */( W: t7 O3 \, r' a6 m
                    }

    ! P0 o% X9 C" ]" B5 `* X) V* V; R5 K        }% P4 w- a" M! k$ f) Q( A- o9 |: H
    }8 F6 F) e# @( j4 u6 T2 g
    : ]1 |2 Y- c3 Z9 E# g+ G  B# B6 S4 P
    xcorr函数代码如上,comp是复数struct, 做过长度为11、19两个矢量的测试,和octave结果完全一样
    2 [! Y! v3 k# N1 r! D/ c
    5 G# }3 g  D' Y2 A9 J红色部分是内循环,现在其内部操作都comment out 了, j0大概是 6000。! G$ e* V! M  _: R: L0 s
    现在call xcorr 100次,耗时78s.
    $ E% i5 D( v2 t! D. g! [( i# j; B  d: _! d, d
    如果把红色部分内循环本身完全comment out, call xcorr 1000次,耗时 <1s.
    ; G' G  R  E0 E( r8 r
    ) D$ h7 j5 v/ ?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    6#
     楼主| 发表于 2022-9-25 00:17:17 | 只看该作者
    风雨无阻 发表于 2022-9-24 23:33
    ! d: b) w' ~1 KMaybe Debug mode?
    . C. h! s! T2 l# b. [- `( d
    9 A* \0 p# |# \, ~& {2 a7 o; J
    不应该,看我上面的回复。/ C7 Q% R5 c  W6 h5 W) @

    5 t; j( O1 O+ {我更怀疑是 VS 社区版的问题
    回复 支持 反对

    使用道具 举报

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

    [LV.Master]无

    7#
    发表于 2022-9-25 00:20:10 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 00:24 编辑 7 F2 Y4 b3 O8 q* p
    雷达 发表于 2022-9-24 23:54
    7 `$ }9 p3 b$ h5 {0 ?! D- ^void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    3 A, ^# \8 G6 B: M{
    : k' S* i1 q# b# ^4 V        comp temp, xtimesy;

    " L1 \" Q- \* k" f! Y$ q+ k- i3 L* i4 [- F
    这个不是这么比的吧。。。$ m& T2 ~. ^3 D4 D7 U0 T

    0 A3 ]% M7 Y) z3 B1 F# B您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。$ w' P/ o* h' {0 f
    . _5 Z" b7 Y, P0 G0 Y5 _
    而加上内循环,光jmp和dec指令就至少多执行了6000个,慢个几十倍不是正常的么?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    8#
     楼主| 发表于 2022-9-25 00:46:56 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 01:09 编辑
    , T  M& s9 e2 H* l; X6 r) H2 i
    数值分析 发表于 2022-9-25 00:204 |4 _( A1 Q. h: X/ O+ O" s; ~
    这个不是这么比的吧。。。
    7 Z: Y  m5 N0 M* U/ Z* ^% G! x* g$ Z$ h6 u- Y1 S) y! F
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    ' S& x3 c" `9 R, }) H$ ~" ^5 g

    # K; {  {# Z* ^% z5 r有道理。
    ; A4 m( h) m% X: c& W/ ?所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,记得 numeric 库里有算向量内积的,我回头试试。: E$ ~! r* w; R' [+ V( |

    / ~5 A  a3 X* ?0 J* C# o我先尝试尽量用标准库,一个小程序,不想搞得太复杂。多谢了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    9#
    发表于 2022-9-25 01:27:53 | 只看该作者
    雷达 发表于 2022-9-25 00:46, }/ [( m+ z7 L; w2 Q2 {
    有道理。: G% B! v* F3 [
    所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,这大 ...

    / O: |1 d5 C+ d3 l7 _: [; X: ?& k你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子,把循环本身翻译成机器指令loop或dec/jnz,两者速度上会差很多
    . P+ q$ X7 t3 O/ \: ?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& i- u* F( _& v+ h# u! T7 e/ U
    这个不是这么比的吧。。。
    # G6 }2 D: l2 D  {5 i8 d& G* D& F
    2 i$ o  e# G. H- W您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    而加上内循环,光jmp和dec指令就至少多执行了6000个
    2 g0 j: T3 ]. B1 p" ^
    7 x" `2 n) C- X  R# s$ ?, q4 X( r1 k
    现在的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 编辑 2 c- ]0 T& a% w, }, r3 w' l
    沉宝 发表于 2022-9-25 01:48) `8 |5 H3 k3 V% F/ b
    现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果 ...
    , O- Y; ~( @3 Y0 W5 {
    ; c6 z0 I6 }! Y3 r. ]: v, t
    是的,兄台说的对。
    " a5 j4 R' _8 U& G# G9 k' R2 B: `' n, W' @# c+ e3 C
    其实我想说的是 真正数值计算部分和代码中其他不直接计算的overhead的比值这个事儿。
    : ~5 @: N- l( b& l; l) Y
    . I/ @; C& e* \7 v% M雷达兄构造测试用例的时候,屏蔽掉了所有计算的部分,使得剩下的都是overhead,这样run time比较的结果就显得好像不合理了。如果把计算加回去,计算部分的run time会dominate,结果就不那么离谱了。因为不好说,所以用指令数对比的方式试图直观地说明这一点。8 V6 |) _. L- M2 k- X  A
    ) u! k6 E) o+ p2 s; @! g
    比如说,如果有计算,那么跑六千个循环相对于计算应该用不了多少时间。但是如果一边是什么都不做,另一边是六千个循环,那六千个循环比什么都不做慢几十倍了,就不是那么不合理了。9 p- Y' A: O( o! n
    $ r% W/ j0 l# V) F) I* Z
    当然也有可能像兄台说的,是优化参数的问题,但我觉得更多地是测试用例设计的不合理。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    12#
     楼主| 发表于 2022-9-25 04:47:43 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 04:49 编辑
    # [6 Z7 K- U& b0 h2 E
    沉宝 发表于 2022-9-25 01:27
    - A" E4 b% [; [3 P你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子 ...
    - l, M0 e; s' a$ U( m

    8 G( V8 i% Z: ~& t' A6 Z5 ~/ m又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差一倍,我上面这个差的太多了。
    2 n8 j# g. R) C+ S7 B+ o# y1 Y/ h( q% X8 Q# k
    我已经完全懵了。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    13#
    发表于 2022-9-25 05:51:23 | 只看该作者
    雷达 发表于 2022-9-25 04:47
    % r; u5 W( Z% q' f4 g- R/ V1 d6 [又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...

    ; r: j" P: Q" \1 n5 _, N" i/ }3 m& E' P时间差一倍的结果可以接受。
    & x- D* o' K# T9 D0 a
    , W  H/ k$ P* G' d: I你还是用profile工具看看吧。现在大家都主观瞎猜。
    回复 支持 反对

    使用道具 举报

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

    [LV.Master]无

    14#
    发表于 2022-9-25 14:58:59 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 15:38 编辑 2 s9 p/ V6 B- B6 j9 O4 ?" R/ i  o. u; t
    雷达 发表于 2022-9-25 04:47
    " C9 q5 y. Y7 Q& w: _# I又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...
    + Y3 ^8 Z% H/ a6 @

    2 t4 o  j* Q" @6 y% j1 B- H
    ( B1 E* O6 w6 d$ F0 N, Y) z& s$ Y  Q$ D3 T( w( s% L' h) d% t8 [: N$ O
    能不能把这个也贴上来,看看和上一个有什么不同?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    15#
     楼主| 发表于 2022-9-26 01:30:03 | 只看该作者
    本帖最后由 雷达 于 2022-9-27 01:17 编辑 * Z) g# D* D2 a1 e1 q8 @8 D' v- j
    数值分析 发表于 2022-9-25 14:58
    * E6 Z4 h8 r; u$ K5 g能不能把这个也贴上来,看看和上一个有什么不同?
    ) Z1 {- s; D: k1 @' T
    理了理思路,重新做了一个测试。
    # u$ b6 Q  L- Z8 G+ V6 ~做了两个 vector 和 两个 float *, 都长 100000$ }) @+ k& \. P4 i& L" D7 b9 j) b
    外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
    * E% w$ a; a; Z2 d- |5 Z8 t1 F& a" y. W% ^
    内循环试了4种方法,
    6 y, s7 F0 R6 w( J8 _7 W% w+ i1. 直接调用 vector inner_product 247s
    0 t+ g! c/ W9 |% d1 o2. vector 循环点乘累加 237s: {0 _0 G2 h) Q& l
    3. float * 循环点乘累加 204s
    ! j. b4 _) j/ V. `4. 空循环 100000 次 202s0 V: q5 O3 `. P0 ^  x

    . O- i' k/ I0 f9 B1 b不做内循环 200s
    5 r1 X( L1 q) F1 f: A, S) u2 F1 g7 P3 r' A: a9 W0 m
    你昨天说的对,内循环本身占比是很小的,大头在其他处理。
      |" z. O# N( e另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
    1 U2 Z- c* @3 m) {  ?" F  C! g/ i( w. v5 k! b( R, s5 M4 j
    至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)) k7 F& ~9 V2 N# N! p

    7 ]; t4 N" {7 |/ K+ c* F( \- J2 ~(为什么下面我贴的  b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成  jj 好了,原来 方括号里的 i 是斜体标志  LOL)
    # P; V/ [' ~" X9 y+ w& Z, E
    1 v$ g3 G- x9 U$ a- R8 w
            std::vector < float > vec1(N);
    , ]3 e, u% U& W6 C- h        std::vector < float > vec2(N);
    ; e% X0 i# `4 Z        float* b1 = new float[N];: F4 E& W& W4 ?* @* C# z$ R
            float* b2 = new float[N];
    % K! y1 m! o; r4 Q2 W( g0 T( r9 S; b: R& n4 V4 z; b
            for (int j = 0; j < 6000; j++)9 R# J6 O& K' ]
            {
    9 @, q4 m" z" B3 y. F                std::generate(vec1.begin(), vec1.end(), []() {
    5 {# G. Y( B* O. c. y0 s. ^7 C                        return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
    8 ]6 {: l7 _0 f6 H0 e) g$ w8 M                        });
    ' d- \( @. \$ [$ r2 s+ M
    + e+ v  n7 n( S5 [# C                std::generate(vec2.begin(), vec2.end(), []() {
    , L; O* U" B; c" D; i                        return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
    & z( H! g6 x* F- A  Z                        });
    5 Q0 o% J" U! H6 D1 [7 o3 S1 F
    2 }/ H9 \3 _) B$ @# A& s. w                for (size_t jj = 0; jj < vec1.size(); jj++)
    5 A( m7 J, ]7 }! N1 @( \! T- s                {
    0 e$ C: R( A1 T! ~! h" I1 v                        b1[jj] = vec1[jj];* L/ U$ \9 Z; h, S$ L
                    }9 [* ^$ M/ d+ J# P6 A+ A; e

    ; N/ P# M, S+ J6 `                for (size_t jj = 0; jj < vec2.size(); jj++)
    4 B3 _( @# j% e' G- z5 w9 K) Z6 n                {' U. i& ~5 W7 t/ d- t+ b
                            b2[jj] = vec2[jj];
    0 b0 b: M, N3 _2 L) R( q) I# x                }. Q$ O' u  z. n- t  x, |

    " E  _7 M2 ^3 e6 f                //Method - 1  N=100000 247s  
    # N, C1 w/ R2 F, Y8 O. E( K6 T                //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);" `5 b+ t3 ]; y6 }5 B) \3 u9 [
                                    
    ( n* p4 W7 R/ A" \! Y9 h                //Method - 2  N=100000  237s- s3 R5 n% e$ x( `1 D  P
                    /*' S3 C6 G/ Y- L: B+ X
                    for (int jj = 0; jj < N ; jj++)
    2 x" R$ E+ L4 n5 v2 C6 v3 I' Y                {4 ~+ `+ ^# I2 ~
                            fresult += vec1[jj] * vec2[jj];; Y- T& P/ T0 R. r
                    }& H4 s2 w) P2 }# l7 f, }
                    */
    " G9 h  q; s7 Y5 h" t$ Z                                
    4 e/ J- g" s5 o$ k/ e: z7 u1 J                //Method - 3  N=100000 204s
    $ C" b8 g0 Q8 [, c$ c6 x& {                /*: F/ J: D% P& @
                    for (int jj = 0; jj < N; jj++)
    % G& C+ }  Y3 _: I; Z+ t2 w3 d                {" K3 D6 v; `3 k- i5 \- V
                            fresult += b1[jj] * b2[jj];; g* u: {' \3 m* H
                    }
    6 k5 o0 U' u4 t                */
    * ?1 P" ?0 E0 P+ y, Q$ g0 ^6 K
    3 C! R8 ]: D  i0 B+ ?/ S$ i                //Method - 4   202s# ]4 _' a, ^- x  g, T+ ~2 s
                    /*& U9 U$ p; T. C
                    for (int jj = 0; jj < N; jj++)0 ]8 Q. {5 u% I/ o7 D8 k
                    {8 I' P/ |* c* T6 ?! b
                            3 J2 H; w. g5 \: z( f4 M( |8 O
                    }
    ( `( k, _2 d! @                */5 Q3 N4 t$ r' O4 i3 @" I
                    //comment out all methods, N=100000  202s               
    6 k% x8 Y0 o& {6 T& o8 b        }
    % I1 g# N5 K2 S+ t" O2 F. Z. W% ~9 S/ `0 a. @
            delete []b1;3 W  X7 C! {7 N, [) G
            delete []b2;

    ( p4 C$ K0 @, d7 r- k) f" W
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    16#
    发表于 2022-9-27 00:15:38 | 只看该作者
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?1 {/ P$ G3 x% a' M

    % G, w* j5 m6 H你第二个试验里面的j在循环里面又重新定义了啊,你确定真的跑了6000次?
    1 |+ d2 t( z* n3 K
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    17#
     楼主| 发表于 2022-9-27 01:16:03 | 只看该作者
    机器猫 发表于 2022-9-27 00:15: \9 x; p( t+ g/ Y% g
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?# `; W+ f0 |8 x  C/ Y) L8 G% ?- \

    6 f' f7 B( }5 i' ~你第二个试验里面的j在循环里面又重新定义 ...

    " ~& G% B8 V" |* D内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL
    , Y+ t8 H0 i( K  B* R; s9 M% Q  F2 f! [5 W; U. l
    不和它较劲了,瞎耽误工夫,我已经转到 ubuntu, 也准备顺便试试 avx2 向量化。
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    18#
    发表于 2022-9-27 02:06:58 | 只看该作者
    雷达 发表于 2022-9-27 01:169 x1 m$ c7 X. F# \, R  x6 B% P
    内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL5 _8 S1 Z0 j0 v# G# L# ^5 |
    % f/ H& i; G2 w
    不和它 ...
      e* c/ f5 a' U$ y

    " J! m" }* M. F9 ?不过可以试试我说的register变量。前一个试验j是混在一堆其它变量里一起定义的,很有可能是在stack上,这样内存读写会更多,要是再碰上每次都需要加载cache就更慢了。
    ( }6 X2 E" d8 k后面一个是在循环那里定义的,说不定编译器就把它优化成register变量了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

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

    使用道具 举报

    该用户从未签到

    20#
    发表于 2022-9-27 20:29:50 | 只看该作者
    雷达 发表于 2022-9-24 23:54
    ) b" I  N, Z  S! k9 s+ [6 g: ^6 s) lvoid xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    ; V/ d% t. `, @3 ^+ f{
    ' w! @" J8 k* V5 L! S% ^        comp temp, xtimesy;
      Z4 m- |; l  U4 ^8 a+ ~0 w6 G, G! c
    这个code里面如果Openmp没有被注释掉的话,那么temp那个变量应该是定义在循环里面,否则线程之间会存在争夺写入那个temp的风险。
    & q5 F" y" g+ s5 n9 }5 Y2 H内层for循环如果没有内部操作的话,编译时应该被优化掉了,和你完全注册掉整个循环是一回事。可能你的编译设置没有打开优化?2 B% z# u! `& f5 L$ {  v/ K
    VS社区版没有问题,我工作用的就是社区版,设置正常的话不会比商业版差。以前游说头头用Intel Compiler,他说不想花钱,而且差不了多少,就一直用到现在。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2026-1-18 02:43 , Processed in 0.041659 second(s), 19 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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