设为首页收藏本站

爱吱声

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

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2022-9-24 22:54:26 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
    C++ 比 Octave 慢好多,怎么破?3 K& ]) c3 @9 E3 E* C/ Q- k- j! y

    9 F: N# e8 f. o/ [5 Z4 Y$ Q" t自相关两层循环,内层循环涉及浮点数计算,试验了一下把内层循环内部全都 comment out 只留个壳子,  但空的内层循环本身就把速度拉下来了,看来问题并不在浮点计算。+ K1 U# W1 b& X- O) T: j
    : _6 v5 ?8 m! E) a. @! V$ j$ Y
    速度优化问题真的很有意思啊。! @+ N, `9 h0 m! X) n

    9 a8 \# s' k( c* W) O) a欢迎大家继续讨论

    评分

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

    查看全部评分

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

    [LV.Master]无

    沙发
    发表于 2022-9-24 23:04:16 | 只看该作者
    拉下来?拉多少?* n+ F/ @# C" Y. [5 m' D
    把代码贴上来看看?
    ' M( N; f- ^" I( x1 r. s
    8 D# t0 r1 i6 A* G难道分支预测不准破坏流水线执行?不该啊。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    板凳
    发表于 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 编辑
    0 H/ c# b) W, V2 g/ }* F+ z" x
    数值分析 发表于 2022-9-24 23:04
    - @8 ?' p5 n/ ?" E拉下来?拉多少?
    % I, P# [0 X% c' g4 j1 }把代码贴上来看看?

    " J; l6 N' d& O
    ; F/ X9 L; j# ?- K* {% J) m' _void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)) I# r! M1 ]. c/ i0 ?
    {3 M* Q0 _$ K' a, F3 G) ^5 c' J
            comp temp, xtimesy;) t( Y# E, p6 j3 g1 e
            xtimesy.re = 0;4 i6 \+ Q, l+ t" X3 F- s6 H
            xtimesy.im = 0;) [4 |$ N5 G- D% L' u4 i6 _
            int j0 = lenB - 1;% c9 K- |% S) B; F( `& b
            int    i, j, i1, reali;" Z/ \  \9 u6 M8 V/ e
            if (lenA % 2 == 1)
    * }) D6 R. y; j$ I- B5 w  `$ ^                reali = lenA + 1;! d# @0 y# ^" B" E/ u! X
            else
    , r! L8 R6 @2 G2 d0 L                reali = lenA;! e/ M) \5 M" O$ o. b+ B
            reali /= 2;, a, o; m; j% F
    6 Q3 w# h2 K' U/ u7 ^. B1 W( X
            int nconv = reali + lenB;
    7 R# [& N* Y! P: Y2 b# \3 C        //#pragma omp parallel for
    / s# p6 m0 _4 e: B        for (i = reali; i < nconv; i++)
    ; ~/ u( \& N) H# O  P; q, C        {
    # J1 X0 t. d1 `5 K; ~                temp.re = 0;4 U" ~: U: c; l0 r6 E+ g$ \9 N
                    temp.im = 0;8 n& }. Y( K* N7 h6 |7 z
                    i1 = i;9 k: Z: `" V% x! g+ o
                    for (j = j0; j >= 0; j--)
    ! g: D1 h: A9 w8 m                {8 {3 C% n" t2 O. x" R4 O& C4 i
                            /* floating date operation */4 T- Z8 b' v7 q2 h0 ]8 r
                    }

    ; u9 Q+ n; W. K/ y& @3 Q; ]1 P. S, g: @        }
    * V, o4 @, I& s3 t+ A8 {- d, ^; t}: `% D# W9 }) p
    # B4 h& b/ ~& c4 [/ j0 j, a0 g+ j5 c
    xcorr函数代码如上,comp是复数struct, 做过长度为11、19两个矢量的测试,和octave结果完全一样; t$ Z- U$ U0 R! ?8 ~) v2 l, H

    9 V0 Z% L( F, L  K$ h: ~  z红色部分是内循环,现在其内部操作都comment out 了, j0大概是 6000。8 V  G4 @* H3 O% b
    现在call xcorr 100次,耗时78s.1 f: r: f7 I7 G% H" N" w8 O

    / c% I# F. C, C如果把红色部分内循环本身完全comment out, call xcorr 1000次,耗时 <1s.
    . Z( |3 i) |& O% i. @1 Y( _4 X6 d$ E! F
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    6#
     楼主| 发表于 2022-9-25 00:17:17 | 只看该作者
    风雨无阻 发表于 2022-9-24 23:33
    " O7 O7 e2 H6 m; _/ _( O; J5 }5 HMaybe Debug mode?

    8 C3 _! x3 e& J3 b) b* \' k- k3 S& e# s1 g7 C- F; e
    不应该,看我上面的回复。
    2 |1 F- ~- |' Z( P9 O5 }
    # l. X7 m" \# v' X) l& `! L我更怀疑是 VS 社区版的问题
    回复 支持 反对

    使用道具 举报

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

    [LV.Master]无

    7#
    发表于 2022-9-25 00:20:10 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 00:24 编辑 , L/ M/ n! }( ?+ d8 J2 h- Y& U
    雷达 发表于 2022-9-24 23:541 p& p# e2 P# A' t  g9 B
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    0 B* P( L6 k0 N" G{
    ' b) T5 _! ]" e+ v' B$ [9 \: ~4 P( C( @& H        comp temp, xtimesy;
    3 y# l" k, x' L5 ?# X, p

    ! d5 G& t4 D8 k) v! U这个不是这么比的吧。。。) {7 c) x1 s) P4 j3 O8 Y1 Z
    ; c7 Z* {2 z2 |* v/ ?! `
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。/ |* S2 B" L+ p1 N5 O0 e
    # v+ ?; ~# e% T' O' x& Z
    而加上内循环,光jmp和dec指令就至少多执行了6000个,慢个几十倍不是正常的么?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    8#
     楼主| 发表于 2022-9-25 00:46:56 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 01:09 编辑 1 e- t- d: C+ S  P5 c- Z
    数值分析 发表于 2022-9-25 00:20  }, T" O6 W5 {6 d3 ~
    这个不是这么比的吧。。。" a  ^/ y$ d7 y, }1 P1 i( L* O  K

    0 @4 q- P/ o0 W, V您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。

    9 g% ]/ M2 U( b( N2 ?& d& q* V4 G: h
    3 B$ ]) _# a, [" q有道理。' \2 E4 r( l2 Y! S8 x
    所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,记得 numeric 库里有算向量内积的,我回头试试。& i- x! c0 ], J. B9 s* U1 l

    + p( |8 {1 @" h( D) j我先尝试尽量用标准库,一个小程序,不想搞得太复杂。多谢了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    9#
    发表于 2022-9-25 01:27:53 | 只看该作者
    雷达 发表于 2022-9-25 00:46
    5 i* x3 @5 L, C' @8 _有道理。
    % d, h: m0 T& o5 |; e/ ]) P5 d所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,这大 ...
    $ d+ }3 L# r3 Z0 J5 I
    你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子,把循环本身翻译成机器指令loop或dec/jnz,两者速度上会差很多
    : A/ K( @# f, n4 m1 o& K+ j' W3 U; S$ PWhy is the loop instruction slow? Couldn't Intel have implemented it efficiently?
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    10#
    发表于 2022-9-25 01:48:51 | 只看该作者
    数值分析 发表于 2022-9-25 00:20
    * a( {; A* O& i3 J这个不是这么比的吧。。。
    / r" l9 r; |- H) y. C8 f
    ! [- z  x) L4 C9 F% [您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    而加上内循环,光jmp和dec指令就至少多执行了6000个
    9 A4 a8 ?& z( \0 d, g6 {
    1 j6 `3 T& W  ~1 Y) }1 ]& E& L
    现在的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 编辑
    : \# k5 f, K7 T% k' j0 L/ P
    沉宝 发表于 2022-9-25 01:48
    2 v+ V- I+ D$ p1 ~9 }4 `现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果 ...
    # J2 B$ v# o5 M+ ~7 P3 P) j+ |2 a
    " r1 d: V! |3 z! ]4 {0 [: g7 x0 m
    是的,兄台说的对。) c, `3 c' W/ _! {  U. J6 m
    ! ~( l/ B$ S3 m7 q7 p  q) ]
    其实我想说的是 真正数值计算部分和代码中其他不直接计算的overhead的比值这个事儿。
    $ z5 K& E5 [) J5 T, M. [
    + u4 o; ?; \  W- _; F+ ^) i% d雷达兄构造测试用例的时候,屏蔽掉了所有计算的部分,使得剩下的都是overhead,这样run time比较的结果就显得好像不合理了。如果把计算加回去,计算部分的run time会dominate,结果就不那么离谱了。因为不好说,所以用指令数对比的方式试图直观地说明这一点。; G! {, w  y; q) Q
    7 D$ A, @$ o) f, }- `1 L
    比如说,如果有计算,那么跑六千个循环相对于计算应该用不了多少时间。但是如果一边是什么都不做,另一边是六千个循环,那六千个循环比什么都不做慢几十倍了,就不是那么不合理了。# F- s6 s5 a# ], |
    / T( m4 r( Z* Y0 I. G; r4 r
    当然也有可能像兄台说的,是优化参数的问题,但我觉得更多地是测试用例设计的不合理。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    12#
     楼主| 发表于 2022-9-25 04:47:43 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 04:49 编辑 8 d' N" S9 G+ V
    沉宝 发表于 2022-9-25 01:27. H9 F  O$ Q4 q
    你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子 ...
    % K; b# F% \* |) z6 ]

    $ C4 V" q% {1 L& x5 k0 e. H7 z又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差一倍,我上面这个差的太多了。
    9 e% W  |7 B( V! N1 E( o+ m7 H9 d2 s/ m$ t
    我已经完全懵了。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    13#
    发表于 2022-9-25 05:51:23 | 只看该作者
    雷达 发表于 2022-9-25 04:47& L5 i/ F* @1 F8 D( Q' ?1 f( K5 U) ~
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...
    / H: R! _" R$ r1 [( R
    时间差一倍的结果可以接受。, U7 `* P& j9 i7 H  ~

    * O8 d/ m/ V% h5 Y1 J你还是用profile工具看看吧。现在大家都主观瞎猜。
    回复 支持 反对

    使用道具 举报

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

    [LV.Master]无

    14#
    发表于 2022-9-25 14:58:59 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 15:38 编辑
    " ]! T( D, x& p1 O/ K( v6 U5 M
    雷达 发表于 2022-9-25 04:47$ P* K$ j- y9 J& `; c
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...
    : t+ `) \) B3 V5 m

    4 c4 d6 m( y" K. P0 P' b. z7 O0 m+ ?* r. w8 d
    % @# a+ R) u1 k* z) B" k
    能不能把这个也贴上来,看看和上一个有什么不同?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    15#
     楼主| 发表于 2022-9-26 01:30:03 | 只看该作者
    本帖最后由 雷达 于 2022-9-27 01:17 编辑 ! e4 p( x7 u8 i- V2 h5 W
    数值分析 发表于 2022-9-25 14:58% ?% F! g4 ]2 {
    能不能把这个也贴上来,看看和上一个有什么不同?

    ' a0 r4 L  @5 O7 r理了理思路,重新做了一个测试。! a# E9 X; G& j8 R! H: I8 q
    做了两个 vector 和 两个 float *, 都长 100000
    ( G3 `0 D9 w/ ]% y( X- A外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.  H/ w0 D4 T7 s. }7 b/ m7 Q. I

    3 b; i1 R; r1 R7 t6 ^( L内循环试了4种方法,: |$ R- t6 f2 m" y7 u
    1. 直接调用 vector inner_product 247s 3 K+ C* x% j- p1 ~
    2. vector 循环点乘累加 237s
    0 I3 u6 p( d6 x- l3. float * 循环点乘累加 204s
    + l& Y) W' Y% k3 O' v1 y4. 空循环 100000 次 202s
    + L, @, x; ?7 Y  g# c( }) g! X# A' T  O
    不做内循环 200s# R5 U  Y" v1 C& J4 r
    5 f6 l1 Y$ Q' E# P
    你昨天说的对,内循环本身占比是很小的,大头在其他处理。
    ! N- i$ u% Z( H& D. R* {# U另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。5 e3 @2 R& p3 H( k% o( E, z- M8 @

    . d$ J7 D0 X  J0 w% `至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)/ v- r4 x$ J2 P  ]' u7 b* q

    3 X7 w# [% G0 d(为什么下面我贴的  b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成  jj 好了,原来 方括号里的 i 是斜体标志  LOL)
    + P; H1 G( y' l! l; h% {# w( ~& o& v# \
            std::vector < float > vec1(N);
    5 P/ e$ N: e: @5 j& G7 [        std::vector < float > vec2(N);- m. A: l) {( H* j/ E
            float* b1 = new float[N];8 @! U8 z6 e* N
            float* b2 = new float[N];, b) L0 M' T) u, j8 v' E7 G4 s

    0 w+ a7 J2 x# n- @" y: i        for (int j = 0; j < 6000; j++)" u* k) j7 p( u: z
            {
    % n+ N: d; D  T" s5 ]                std::generate(vec1.begin(), vec1.end(), []() {
    5 f2 ~$ j2 e$ u+ Y( L: R. W                        return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;0 N, ?' K4 H$ ?+ I% V3 J. t" r
                            });
    7 X+ t& H; Q+ h/ B" V: X
    , W0 B% b  j  _' g1 A! F- `2 ^5 G                std::generate(vec2.begin(), vec2.end(), []() {
    + b% D3 `' c. u/ ?- L) u0 n                        return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
    / E0 c+ S# \7 ]- ^1 O+ H                        });. J  m2 |$ W, f% N8 ^' [5 G
    , a' i, V! m' \; U9 G- H- n
                    for (size_t jj = 0; jj < vec1.size(); jj++)
    * A2 X! h. r+ }  t. e                {
    1 N2 U( ^; p3 [$ r1 S  V$ M9 v                        b1[jj] = vec1[jj];
    & c* R# z7 |  K" ~( q6 t/ Q% h+ H                }9 |: Q! N# L, d, E6 P0 [

    + k4 M9 T$ n( X' j5 F- ^/ v7 C                for (size_t jj = 0; jj < vec2.size(); jj++)+ x) `0 d  p( B/ i
                    {
    ( ?1 d; O! S" u" a                        b2[jj] = vec2[jj];
    - M( h0 A. h) r& w5 c                }% N6 B6 T, N6 Q7 @1 F$ Y
    ! C8 e; c: I& f# |: f$ I
                    //Method - 1  N=100000 247s  
    2 O' s  X+ U5 O) R                //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);6 W/ `, m4 E) D1 [9 {% c
                                    % l% j8 I& c% _) o
                    //Method - 2  N=100000  237s) d/ T1 f, }8 M) W4 n
                    /*
    0 ]( L) n, j! Z) J                for (int jj = 0; jj < N ; jj++)
    ! V( [! h1 s# `- l- l5 \1 H                {
    8 u! b7 F/ d+ f8 W0 W1 ?* g3 X                        fresult += vec1[jj] * vec2[jj];
    . F1 N5 L* u: W* k9 T) Z! X                }
    $ i- v( f- D6 r. a  I" h                */
    2 n  n# T) x; [" l                                / i( M. I1 J8 a  d' O- H- k+ O
                    //Method - 3  N=100000 204s# @( F1 d" o5 i- g0 S
                    /*
    8 P5 R7 `8 O$ o3 I                for (int jj = 0; jj < N; jj++); _% n% h5 }# p! _6 \
                    {
    / }" i2 y4 }* b8 x% h8 U. p                        fresult += b1[jj] * b2[jj];
    * A4 c' i% @5 H8 M0 o, ?1 l0 p1 n                }/ x5 ?# \& g( ]" n, ]+ `1 V0 U9 R
                    */
    0 s' L7 r7 P; p+ d2 x9 F7 ]1 o; V6 G) K+ d& E
                    //Method - 4   202s
    - X/ b3 L, n/ V% ~& ?                /*4 w( |& e: }! v% a7 r2 w8 v
                    for (int jj = 0; jj < N; jj++)+ w# B0 O& N  u' E- V
                    {4 m  Q! `/ x9 R) O( t
                            
    + O& v$ E7 h' L) i                }
    4 ?- \) ?3 g$ S8 }' H3 h                */! m/ W/ q5 S, h- \! Z9 ]
                    //comment out all methods, N=100000  202s                / Y5 N4 e2 N* h( r* D  W( a
            }1 H* S" l' v9 j' X1 O3 q1 @

    & f! B! z2 ^5 c  E( k0 s        delete []b1;4 g% l1 b2 J9 c
            delete []b2;
    ! ]( a0 F( O" B: w$ j
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    16#
    发表于 2022-9-27 00:15:38 | 只看该作者
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?4 Q, y8 Y! M0 l. b$ w. F' s

    ; W& {& O8 [* r% ^; j# G你第二个试验里面的j在循环里面又重新定义了啊,你确定真的跑了6000次?% ]4 T: w4 d4 s/ T
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    17#
     楼主| 发表于 2022-9-27 01:16:03 | 只看该作者
    机器猫 发表于 2022-9-27 00:15
    3 U4 c7 |; k, h/ f9 U/ ^3 o4 P: I9 L6 ^瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?$ I# a9 V: W9 e% K2 h* V

    : [# G$ |% H+ v你第二个试验里面的j在循环里面又重新定义 ...

    0 v* E+ J( u3 r$ e3 _内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL
    3 y4 X" j- N- A3 T% h  ^! m6 Y& R8 I8 E# Y) k) r' X9 R0 @% N7 M/ R
    不和它较劲了,瞎耽误工夫,我已经转到 ubuntu, 也准备顺便试试 avx2 向量化。
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    18#
    发表于 2022-9-27 02:06:58 | 只看该作者
    雷达 发表于 2022-9-27 01:16
    5 ^& O) V4 H9 Q6 \4 i内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL0 Z3 T2 Q* n. v2 c  [
    5 M5 p/ b% ]6 t7 O* C7 F  g# x4 M; m
    不和它 ...

    1 j2 Q& i1 Y( A% t" f" [7 W
    & e. b+ h6 p+ B$ @7 F不过可以试试我说的register变量。前一个试验j是混在一堆其它变量里一起定义的,很有可能是在stack上,这样内存读写会更多,要是再碰上每次都需要加载cache就更慢了。
    4 Y) G" ~- \/ U/ x7 `! B  h后面一个是在循环那里定义的,说不定编译器就把它优化成register变量了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

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

    使用道具 举报

    该用户从未签到

    20#
    发表于 2022-9-27 20:29:50 | 只看该作者
    雷达 发表于 2022-9-24 23:54
    % l- Q3 B; c- _void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    6 _5 F8 C1 V; _" q$ G( ^{; M! l+ M! n7 _2 P! v6 I& z6 b
            comp temp, xtimesy;
    + R3 C6 S/ N- B3 P
    这个code里面如果Openmp没有被注释掉的话,那么temp那个变量应该是定义在循环里面,否则线程之间会存在争夺写入那个temp的风险。/ i+ {/ y+ w8 K8 E
    内层for循环如果没有内部操作的话,编译时应该被优化掉了,和你完全注册掉整个循环是一回事。可能你的编译设置没有打开优化?
    0 z" M+ ^1 S  f' {! w% q3 ]+ a3 YVS社区版没有问题,我工作用的就是社区版,设置正常的话不会比商业版差。以前游说头头用Intel Compiler,他说不想花钱,而且差不了多少,就一直用到现在。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2025-12-8 05:19 , Processed in 0.065247 second(s), 19 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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