设为首页收藏本站

爱吱声

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

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2022-9-24 22:54:26 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
    C++ 比 Octave 慢好多,怎么破?2 J* v. S6 e) H; j+ Y1 j$ z7 s3 x
    " E( L, U# |+ h& |& i8 F- ?
    自相关两层循环,内层循环涉及浮点数计算,试验了一下把内层循环内部全都 comment out 只留个壳子,  但空的内层循环本身就把速度拉下来了,看来问题并不在浮点计算。! T4 e" R* Q$ H  E; \6 l

    6 K1 U; }1 j+ }% H* s+ b8 ~( v速度优化问题真的很有意思啊。
    0 S) @4 G- e" @2 ~
    7 O' l, S1 @- \  G( `9 M欢迎大家继续讨论

    评分

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

    查看全部评分

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

    [LV.Master]无

    沙发
    发表于 2022-9-24 23:04:16 | 只看该作者
    拉下来?拉多少?
    $ m; p  j. [+ y6 _3 T) K2 t把代码贴上来看看?- C* ^$ d: s: U- t" v4 r% `

    ! T) m! a3 I) ^+ Q难道分支预测不准破坏流水线执行?不该啊。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    板凳
    发表于 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 编辑
    , m6 ^5 m5 s  d
    数值分析 发表于 2022-9-24 23:04
    9 b% J+ O' o/ y3 \( w拉下来?拉多少?
    3 L  W# L; q6 Y把代码贴上来看看?

    ) j- X* n; N# F! W; }+ y% f3 e' I; |" E1 f+ m) B
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)1 R7 b1 K+ l; l4 k
    {
    & E" @% H& ^+ V0 Y8 F" Q6 h9 M4 t        comp temp, xtimesy;
    7 O3 k- S8 S3 F* p. u) m0 K        xtimesy.re = 0;
    # v. k- S% ~& S1 l        xtimesy.im = 0;
    7 [8 z1 ^& M, @' z# y0 B4 O5 ^        int j0 = lenB - 1;
    1 U7 _, x1 X+ E$ H8 R- N        int    i, j, i1, reali;
    " u) d+ m+ b+ l% V8 j3 i; {( Q( u        if (lenA % 2 == 1)
    $ u8 o2 n3 i+ d5 u7 q7 d                reali = lenA + 1;
    9 ^+ K0 u- F$ v8 h: r        else
    0 F6 g) n' w6 z! [                reali = lenA;
    8 W, ^: a7 l( w        reali /= 2;" p# G5 u3 g6 r. M1 w

    / [9 P* q6 S4 P        int nconv = reali + lenB;
    8 C/ p2 L5 y9 ]4 @" o        //#pragma omp parallel for
    ' O# S" i5 G& N$ i: z        for (i = reali; i < nconv; i++); n- K, d. _- O) F# ]- j
            {1 i2 y% t+ f9 C/ G9 D6 \
                    temp.re = 0;0 v1 s9 s5 p' ~. I, t
                    temp.im = 0;( c& r: [# ]7 f
                    i1 = i;
    $ t, b( @/ K# O* W                for (j = j0; j >= 0; j--)
    5 _) C1 g4 _" ]. D& H) X2 ?& V                {
    + ^  H5 g6 L4 P* I                        /* floating date operation */
    $ V# C1 u3 {  V$ [! U                }

    1 _2 M; H( s! L! N7 p        }* K1 k/ H9 |; `* @8 X3 Z
    }
    0 R+ W' C4 v1 v
    9 f9 D1 @+ `: M3 v3 j& Y; wxcorr函数代码如上,comp是复数struct, 做过长度为11、19两个矢量的测试,和octave结果完全一样: a8 ^. r2 h3 W2 J) {' [
    - }4 @" @0 L, k% ]3 l5 u
    红色部分是内循环,现在其内部操作都comment out 了, j0大概是 6000。
    ( a- E9 x' i/ k$ |7 |; J, n" a现在call xcorr 100次,耗时78s.
    ; X( Q7 ]: O4 ~6 S8 i5 S9 y3 w% d$ e7 s% Q  g) [+ z; R, N, l
    如果把红色部分内循环本身完全comment out, call xcorr 1000次,耗时 <1s.
    1 V5 n% {9 V( y" r7 B( Y  _4 _$ x' f6 z
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    6#
     楼主| 发表于 2022-9-25 00:17:17 | 只看该作者
    风雨无阻 发表于 2022-9-24 23:33
    $ s+ @, v" O+ \& Q" E# \0 tMaybe Debug mode?

    * V+ x9 \, L+ L6 ~+ S( e5 f6 l0 b& P; H5 Z- o  G; r! I4 i
    不应该,看我上面的回复。) |' m5 |- O, V* D- Y, H, [6 r+ [
    4 \: W6 [& _" I$ q
    我更怀疑是 VS 社区版的问题
    回复 支持 反对

    使用道具 举报

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

    [LV.Master]无

    7#
    发表于 2022-9-25 00:20:10 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 00:24 编辑
    # |) k6 M0 K7 e6 q' A7 A
    雷达 发表于 2022-9-24 23:544 ?# v4 Z" Q+ {, \9 U! |
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    , T7 m2 h0 n) v1 P{
    5 t) e/ \4 `! x7 G, Z4 ^! x: v        comp temp, xtimesy;
    % x; a9 w, X9 R# |9 M! n
    . v0 T0 K4 D5 w1 d
    这个不是这么比的吧。。。
    6 ]3 {. u7 R; V4 z% J  t" S7 a3 M4 S1 H% m$ H6 ?/ o
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    7 `- b7 ~, ^6 D( R8 w8 I6 b) h0 J2 s+ J
    而加上内循环,光jmp和dec指令就至少多执行了6000个,慢个几十倍不是正常的么?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    8#
     楼主| 发表于 2022-9-25 00:46:56 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 01:09 编辑
    , M8 a! z/ U# S4 D3 n1 o6 q9 Z
    数值分析 发表于 2022-9-25 00:20
    8 u: j  t/ j+ m- `. T0 u这个不是这么比的吧。。。3 `$ {$ I4 i8 m) e
    % C, R. v! f* c- ?5 y
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。

      N- R& `8 ~1 }- |& G  W( L9 [0 y9 i* L7 W6 E
    有道理。
    0 {5 f- B" ?) Q$ {' o所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,记得 numeric 库里有算向量内积的,我回头试试。
    - Y7 X2 W: ^2 k  p: s' ]! u5 b; k# A1 I- @# e# h5 o; b3 Z2 w
    我先尝试尽量用标准库,一个小程序,不想搞得太复杂。多谢了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    9#
    发表于 2022-9-25 01:27:53 | 只看该作者
    雷达 发表于 2022-9-25 00:461 K+ n4 G4 N& W. S- Y! R$ R$ c- u
    有道理。
    3 d  G) C0 Y  s. H' d1 H6 {& B: c所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,这大 ...

    / D5 J- X5 h8 \3 l- J; A$ t7 t你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子,把循环本身翻译成机器指令loop或dec/jnz,两者速度上会差很多# f) ]% L% u: k8 S" d" o) k, @
    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
    + x# f: p$ v3 f, L+ m2 q这个不是这么比的吧。。。$ G( ^0 W. {' f0 p
    ( q% ]* }1 y/ z9 t
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    而加上内循环,光jmp和dec指令就至少多执行了6000个
    ( Z9 b; o, r, b8 h: E% b0 L% w, u

    8 a, G; N* S9 Y0 ?. |5 Z现在的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 编辑
    - K" w% V4 u: s  [
    沉宝 发表于 2022-9-25 01:48
    ( Q. y$ R$ P& Z" z+ N0 ]# t7 ]8 W现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果 ...

    4 D: K4 o% J* B, u/ z! y  z/ Q% y0 \
    是的,兄台说的对。6 \& v6 P+ T2 F; g( |( \# D
    . N+ G0 b8 u9 ~( C$ _& F
    其实我想说的是 真正数值计算部分和代码中其他不直接计算的overhead的比值这个事儿。
    7 U$ U8 X$ c; a$ W7 X) k8 H2 S; U) @5 ]9 i
    雷达兄构造测试用例的时候,屏蔽掉了所有计算的部分,使得剩下的都是overhead,这样run time比较的结果就显得好像不合理了。如果把计算加回去,计算部分的run time会dominate,结果就不那么离谱了。因为不好说,所以用指令数对比的方式试图直观地说明这一点。
    8 ?2 [4 c9 m% Y
    1 k1 ?8 i  b" C( _$ [比如说,如果有计算,那么跑六千个循环相对于计算应该用不了多少时间。但是如果一边是什么都不做,另一边是六千个循环,那六千个循环比什么都不做慢几十倍了,就不是那么不合理了。, |$ O, f( p) Y

    % b3 X% k' ]4 r当然也有可能像兄台说的,是优化参数的问题,但我觉得更多地是测试用例设计的不合理。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    12#
     楼主| 发表于 2022-9-25 04:47:43 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 04:49 编辑
    + `( j3 N- w* c2 W
    沉宝 发表于 2022-9-25 01:27* m" N2 i: l0 ?
    你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子 ...

    ) Y% Y# }. c3 _, Z- L. l; O, M5 Z; ]4 h1 H6 W6 O7 X* h& O
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差一倍,我上面这个差的太多了。
    3 H3 K# r1 H- C8 H/ m
    3 _$ _0 o& ?/ }2 P7 K我已经完全懵了。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    13#
    发表于 2022-9-25 05:51:23 | 只看该作者
    雷达 发表于 2022-9-25 04:47
    - p' ~3 m( }0 S/ l, y又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...

    9 _' z' p  j9 i: o$ |% q6 p& j时间差一倍的结果可以接受。
    $ p7 {4 V& ^6 @0 ?2 c+ g% a8 j
    ' e7 {9 m; s, X& o+ t你还是用profile工具看看吧。现在大家都主观瞎猜。
    回复 支持 反对

    使用道具 举报

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

    [LV.Master]无

    14#
    发表于 2022-9-25 14:58:59 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 15:38 编辑
    # K1 {* Z+ m+ U& r: I
    雷达 发表于 2022-9-25 04:47: o9 L& x3 l, `, ^# [8 O3 B
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...

    * W2 e; b" Q; U7 p; y/ e' B5 \; m9 k. k! n2 r7 \( F+ Z3 P, L
    & F+ ]3 i! y2 L3 ^2 j2 G6 D3 v/ J
    6 F) w* a/ B6 G' k7 p
    能不能把这个也贴上来,看看和上一个有什么不同?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    15#
     楼主| 发表于 2022-9-26 01:30:03 | 只看该作者
    本帖最后由 雷达 于 2022-9-27 01:17 编辑
    * o- z0 K5 K% Y; R* F7 S: P; E; S% |& [
    数值分析 发表于 2022-9-25 14:58
    ; s- C; g+ M8 q5 Q3 d# Q能不能把这个也贴上来,看看和上一个有什么不同?
      s. p" w5 Q' p/ H+ x
    理了理思路,重新做了一个测试。* R5 x, h2 _8 s6 H8 s4 b0 d
    做了两个 vector 和 两个 float *, 都长 1000006 A* |. z# X; B) V- f/ s. f: J6 ]
    外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
    ! S# ^1 r! B2 n0 g) e4 \: B8 v9 h9 h9 k
    内循环试了4种方法,
    6 C$ S, B* O  [1. 直接调用 vector inner_product 247s
    ; o# K2 N1 }9 w- n' @2. vector 循环点乘累加 237s. o) W  F& U' ]5 F+ t( }
    3. float * 循环点乘累加 204s
    " G0 \* a% j; C, x+ ^8 S6 w7 o4. 空循环 100000 次 202s
    4 j, X+ B( a0 ]& D/ Z. c3 I3 {% u$ U6 w
    不做内循环 200s
    + E. m# d( L9 t& ~$ J
    + r" P$ P6 [6 B  E4 ~. ?& t* Z+ ^你昨天说的对,内循环本身占比是很小的,大头在其他处理。
    & e: X/ C1 o5 Y: Q1 {& R9 c6 |& v另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。0 n4 e* W) o0 ]. W7 ~! a: k

      X: [, \8 D* F3 @& k! E2 t$ |至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试). A  K+ c5 L3 B" m; `
    ) b) {" H% C$ q  p
    (为什么下面我贴的  b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成  jj 好了,原来 方括号里的 i 是斜体标志  LOL)1 B: ]4 j5 a. H+ x7 A' O
    7 |2 z2 t" v$ f+ R, l1 c
            std::vector < float > vec1(N);9 l2 q/ x9 S- y. d+ x
            std::vector < float > vec2(N);
    5 x, T+ v+ h# ~. ~, Q/ ^% C' G        float* b1 = new float[N];
    & A# {5 G# t/ G/ s5 g& G8 x        float* b2 = new float[N];- ^: M4 q6 _# @3 J; y( [

    9 K( _$ s6 X! i1 q        for (int j = 0; j < 6000; j++). M" }0 l" S' }/ {% J$ p9 V/ a) r$ {3 b
            {
      ^$ H* c. }9 [8 P' i9 b                std::generate(vec1.begin(), vec1.end(), []() {- l* M5 h* ^7 s- c& e  s
                            return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
    & w# S$ a' s; v# w6 B- k$ G                        });
    - K# [. F5 Y. r* z8 o
    3 s1 x! Y0 X# t( K2 h. V                std::generate(vec2.begin(), vec2.end(), []() {! `. P$ `5 a2 r  o
                            return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
    9 e% |8 H" E% s  W7 I                        });% L" j& K/ E. Q& \) R: v5 ~4 Z- z

    - h1 @! r5 ]# r: I% J+ r( o                for (size_t jj = 0; jj < vec1.size(); jj++)8 }: Y2 C- l9 I, C
                    {
    1 C* F8 a/ y: E0 T# V& h. `) x6 [                        b1[jj] = vec1[jj];2 K. `. M" i- c% W4 \; A5 ^; c- H
                    }" X) Z; K+ k8 k3 n% A3 Z. g4 k

    ) M) G' Z  Q. C/ m! _" k                for (size_t jj = 0; jj < vec2.size(); jj++)
    # L$ o' V5 C. X  A                {" ~! H! A' W# b9 I& k$ F
                            b2[jj] = vec2[jj];$ F. W7 ]+ f9 A. B) Q  e
                    }$ S# j( j  }/ ~: P# }
    3 }+ p, o" k9 Y$ H0 K
                    //Method - 1  N=100000 247s  / v& `# C$ o, c( h! R. m2 L
                    //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);& R: [; r3 |( U- k  Q; {9 u
                                    
    " x& v( n! P& _6 I6 ?                //Method - 2  N=100000  237s
    2 A) E4 o  K$ M2 a3 w                /*2 o2 ]1 |( b7 G# Y
                    for (int jj = 0; jj < N ; jj++), O8 i$ R% j3 X! z  H
                    {
    1 D& w3 b3 V  N7 }; j1 a. ]                        fresult += vec1[jj] * vec2[jj];* U) F9 a! K( ?# s. _7 Z. _
                    }1 V& o: [3 l1 l% Z+ Y# I+ M# k9 k
                    */9 `7 Y  p9 ]6 q& K7 D+ _  ~2 x
                                    
      w& X8 }" T+ \. W                //Method - 3  N=100000 204s
    6 v5 o" G8 i! }3 m, t* o9 Z                /*
    & j( L9 N! {& U+ ]& }) q) r                for (int jj = 0; jj < N; jj++)
    5 Z7 T% u/ u* t2 `2 z0 ?( H$ y                {
    & }# e: D2 ~. o6 \4 T9 z                        fresult += b1[jj] * b2[jj];
    5 ?* U& ~* N, E3 D0 U5 e                }
    8 n" {2 h! h' x' r8 t) s6 i                */
    ! M+ z9 A' y3 a2 j
    + z+ S; E' d/ r  k  }                //Method - 4   202s
    ) X/ @& N) M3 x' d& w                /*
    # s9 p- a, H' `8 a( Y                for (int jj = 0; jj < N; jj++)+ B9 I& w0 X0 Z+ [$ C, L/ @
                    {
    ( J4 x7 x0 Q! t+ ]5 V1 v- v                        * F  c! F; a( o8 o' V
                    }
    " o; Q2 L% a% u( G, z) t: j                */
    6 Z+ u+ j8 D2 M                //comment out all methods, N=100000  202s               
    1 e) w, H% K4 b- U        }# }6 e- G; I2 S, r  h  u$ T: Y
    0 `5 ~) V2 l$ a/ S: @
            delete []b1;6 i' Y' N5 q" E. Y( `$ r
            delete []b2;
    6 J5 z0 E  ]. d- A# d; ?5 b4 @8 G
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    16#
    发表于 2022-9-27 00:15:38 | 只看该作者
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?
    6 A6 b/ w+ ^7 M" ?- t, J4 B# @9 x# k# R8 E1 X8 a0 Z
    你第二个试验里面的j在循环里面又重新定义了啊,你确定真的跑了6000次?
    2 z) G' I0 i6 k; i1 d
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    17#
     楼主| 发表于 2022-9-27 01:16:03 | 只看该作者
    机器猫 发表于 2022-9-27 00:15! t& z( c( |' p* w6 n' X9 m" w
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?5 j( T. q7 G# X5 N

    / m+ ^4 p* \* i) d; r% t' m5 b你第二个试验里面的j在循环里面又重新定义 ...

    6 J( P* ~% s3 F+ c8 l0 Z0 O4 L内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL& j/ W$ Q( Q% R) Z. t
    6 ~. C6 j# C4 {0 u: c* ]( r- |( K
    不和它较劲了,瞎耽误工夫,我已经转到 ubuntu, 也准备顺便试试 avx2 向量化。
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    18#
    发表于 2022-9-27 02:06:58 | 只看该作者
    雷达 发表于 2022-9-27 01:16
    1 o( G' @, F9 M0 p3 f内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL
    3 A( s' H3 b% e, h" k. K; {/ v7 p% D, O% ~
    不和它 ...

    " ?4 n. ?5 y9 X: V' x8 Q: x" ]4 [  ]2 [* a" b
    不过可以试试我说的register变量。前一个试验j是混在一堆其它变量里一起定义的,很有可能是在stack上,这样内存读写会更多,要是再碰上每次都需要加载cache就更慢了。
    . ~. }: b9 L+ x# i& C, _# c后面一个是在循环那里定义的,说不定编译器就把它优化成register变量了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

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

    使用道具 举报

    该用户从未签到

    20#
    发表于 2022-9-27 20:29:50 | 只看该作者
    雷达 发表于 2022-9-24 23:54
    0 b. e1 S) j2 K% Y8 jvoid xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    % N3 |- i$ r9 k* V5 n  g- Y{4 q& T" |9 L- S( D+ o
            comp temp, xtimesy;

    9 t+ J* J- {: w这个code里面如果Openmp没有被注释掉的话,那么temp那个变量应该是定义在循环里面,否则线程之间会存在争夺写入那个temp的风险。
    ) b9 Q" I; m3 H' B! ?: x内层for循环如果没有内部操作的话,编译时应该被优化掉了,和你完全注册掉整个循环是一回事。可能你的编译设置没有打开优化?! a' p$ ?9 F' `
    VS社区版没有问题,我工作用的就是社区版,设置正常的话不会比商业版差。以前游说头头用Intel Compiler,他说不想花钱,而且差不了多少,就一直用到现在。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2026-4-29 17:38 , Processed in 0.078759 second(s), 20 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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