设为首页收藏本站

爱吱声

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

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2022-9-24 22:54:26 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
    C++ 比 Octave 慢好多,怎么破?* |$ f0 X5 |9 U8 S) |$ f3 u) f

    9 T; M8 H1 \# I+ r# j自相关两层循环,内层循环涉及浮点数计算,试验了一下把内层循环内部全都 comment out 只留个壳子,  但空的内层循环本身就把速度拉下来了,看来问题并不在浮点计算。3 C2 V4 r$ p# N: }
    + ^" @5 a( r$ l+ J0 i: z6 l* o
    速度优化问题真的很有意思啊。
    / V7 q. u8 I) P' v; t3 P7 H' H. j
    ) ], J  r  a4 d$ ~3 S欢迎大家继续讨论

    评分

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

    查看全部评分

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

    [LV.Master]无

    沙发
    发表于 2022-9-24 23:04:16 | 只看该作者
    拉下来?拉多少?
    # r; b$ K! a0 _% R把代码贴上来看看?. t" m% D8 I4 @) U  L

    & {/ R- I4 @5 J' E/ Y, c$ M2 k- R. R, ~难道分支预测不准破坏流水线执行?不该啊。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    板凳
    发表于 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 编辑
    7 b- A5 G- [, m7 S4 }; q+ z
    数值分析 发表于 2022-9-24 23:04$ v' G! K! T4 s7 o& z' M' @
    拉下来?拉多少?
    ) ]  X! h6 b4 D) H( a* p3 p; A" O把代码贴上来看看?

    9 ~5 ~+ a: M3 _* U& @/ S
    7 z% X- J. c* Mvoid xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    " R. A( d/ `9 r2 M{
    ) _& u$ \/ x) h  Q8 u, F! p        comp temp, xtimesy;
    4 t; ?7 `; x7 M1 A* H. n2 u! ^        xtimesy.re = 0;
    2 o+ G( S2 G# F6 }5 T7 t5 C0 b( `        xtimesy.im = 0;: k2 K8 [1 V; D# O+ w$ T
            int j0 = lenB - 1;
    7 {+ K% B! h0 Q( P3 l        int    i, j, i1, reali;
    1 j* {& r" ^5 P8 L        if (lenA % 2 == 1)
    8 _# c% ]/ T4 N3 p$ c$ j& W$ D                reali = lenA + 1;# |3 p4 t& _/ L; B" c+ h
            else
    1 x: ]$ g" s3 j! Z: W                reali = lenA;0 V  ^2 G4 v) n3 c- X( D
            reali /= 2;
    $ L0 O) k: a+ l! T0 {' u, C% G
    : O( b: M2 E$ n# L        int nconv = reali + lenB;
    / R7 D1 p" [, X$ w5 O! X' @$ c        //#pragma omp parallel for7 \1 ?, `$ E: I% m
            for (i = reali; i < nconv; i++)
    9 p. f' u9 G5 t& g, v: V        {" d( S/ ~$ p( i6 A0 R( w$ M/ q
                    temp.re = 0;% n" _. q8 n" }- R% R; p4 U3 B7 u
                    temp.im = 0;
    ! G* h% J' X' l9 m- e                i1 = i;7 |2 @  p, y# R, }# m
                    for (j = j0; j >= 0; j--)$ n1 r$ s+ T6 _# O& M8 ]
                    {6 V$ j/ S6 k, z6 h/ x+ q7 ]
                            /* floating date operation */! {* @  X0 X1 h  z" C( `( h
                    }
    & K  w: Z' x1 m: {) b/ I
            }* p4 M& ]+ M# @$ q
    }: `, n( t% r+ ~2 H3 H
    5 u  }5 u" l2 h5 }
    xcorr函数代码如上,comp是复数struct, 做过长度为11、19两个矢量的测试,和octave结果完全一样6 p3 Z! p2 ?' W- q( h

    5 ]4 h9 |. V% \$ b7 C红色部分是内循环,现在其内部操作都comment out 了, j0大概是 6000。) X& ?# u' _2 Z
    现在call xcorr 100次,耗时78s.
    : R# S$ F6 v/ I& ^* Q( Q) P4 v, x- X9 ?2 C
    如果把红色部分内循环本身完全comment out, call xcorr 1000次,耗时 <1s. , q" D. K* R, k

    ! `, Q( D! [; U% {8 g$ L
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    6#
     楼主| 发表于 2022-9-25 00:17:17 | 只看该作者
    风雨无阻 发表于 2022-9-24 23:33# q+ |: j/ d6 f0 Z  k0 T9 D
    Maybe Debug mode?
    ! E+ f$ V7 E# x: `* O% T7 L

    - A* I% H9 P! b2 ?( G$ D不应该,看我上面的回复。4 E* \  }# }/ H: U

    : w. Q! b5 Z1 O1 U9 d我更怀疑是 VS 社区版的问题
    回复 支持 反对

    使用道具 举报

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

    [LV.Master]无

    7#
    发表于 2022-9-25 00:20:10 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 00:24 编辑
    , i5 l  L- T4 j2 o3 J7 ]( ~
    雷达 发表于 2022-9-24 23:54
    . {# Z& N, h+ F5 s2 A5 _void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    ) C2 T! j/ J; H3 |& M1 [- w* l$ O{
    2 m+ S' B5 z8 w# Z" Q        comp temp, xtimesy;
    + b) r! {5 j9 ~. M1 b* P

    ' i! L5 k. e$ _' L这个不是这么比的吧。。。8 L5 {- ]1 |$ D8 Z' f

    & @, g# X) z, S7 k! ?9 {4 b您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    / N$ y, d0 N: s( q3 t0 V
    6 }* O. z6 v% q而加上内循环,光jmp和dec指令就至少多执行了6000个,慢个几十倍不是正常的么?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    8#
     楼主| 发表于 2022-9-25 00:46:56 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 01:09 编辑
    8 Z. @/ I: x2 j+ h4 r- R
    数值分析 发表于 2022-9-25 00:20
    : e% [  n3 A0 P$ K( a" _: Y这个不是这么比的吧。。。
    ( w) j, q2 j* C* N/ ^9 Q3 g2 X7 k% G. g/ Q
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    : {% r0 ^4 S5 c" _4 c+ b" s0 B

    * c0 ^$ p" h2 D) a9 ^7 {$ u有道理。. |8 z$ a6 K, R, O
    所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,记得 numeric 库里有算向量内积的,我回头试试。
    + m" @' E0 R; ]2 z0 I
    6 ^- ]/ Q3 X. l: m1 b; c* A' N我先尝试尽量用标准库,一个小程序,不想搞得太复杂。多谢了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    9#
    发表于 2022-9-25 01:27:53 | 只看该作者
    雷达 发表于 2022-9-25 00:46
      V4 S/ g' D0 |- _: K有道理。9 z7 j4 l* }2 m
    所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,这大 ...
    9 @& X" B0 ~  I; w7 T; Z
    你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子,把循环本身翻译成机器指令loop或dec/jnz,两者速度上会差很多$ H+ ]# h; t/ O: T" G
    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! s* j* Y( T2 ]0 ^. v7 e; V
    这个不是这么比的吧。。。7 U& r8 l  q- w1 F( ^, c" V& k
    0 r, t: b. k( ?& L! ]1 b% t
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    而加上内循环,光jmp和dec指令就至少多执行了6000个

    6 y* ^" `7 R( ]/ W
    ! b4 y* A  p1 v+ |- d9 F' ~. B9 _现在的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 编辑 4 X, s# q! A+ T1 O0 `
    沉宝 发表于 2022-9-25 01:48
    3 M2 `/ A5 H% ^) p# @( [现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果 ...
    ) L1 x+ l( H: Z  j: a: P
    8 C9 x- t/ s) R9 \! m  `
    是的,兄台说的对。
    ' c  |0 c/ J1 [! W5 v  g) ?+ H) y+ h! \6 `: `' N- m0 X
    其实我想说的是 真正数值计算部分和代码中其他不直接计算的overhead的比值这个事儿。! O# O+ R6 x2 j$ x1 v9 p% B

    . h, t* t. n2 y! M5 M& u4 h雷达兄构造测试用例的时候,屏蔽掉了所有计算的部分,使得剩下的都是overhead,这样run time比较的结果就显得好像不合理了。如果把计算加回去,计算部分的run time会dominate,结果就不那么离谱了。因为不好说,所以用指令数对比的方式试图直观地说明这一点。
    / O# c7 C: ^/ [& W. t  y
    + r0 v$ ~, |5 f( u比如说,如果有计算,那么跑六千个循环相对于计算应该用不了多少时间。但是如果一边是什么都不做,另一边是六千个循环,那六千个循环比什么都不做慢几十倍了,就不是那么不合理了。3 S. q5 A$ ?# k8 K" e/ c( T' K* P. @

    : T$ n$ h4 r3 o5 w8 M当然也有可能像兄台说的,是优化参数的问题,但我觉得更多地是测试用例设计的不合理。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    12#
     楼主| 发表于 2022-9-25 04:47:43 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 04:49 编辑 , Z9 r5 N" g# B7 q8 `! C( }. Z
    沉宝 发表于 2022-9-25 01:27  n: [) }2 i% E% b* j7 b/ s
    你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子 ...

    $ h: u6 k" m* i$ I; O4 X
    % l1 m: f# f$ y9 T又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差一倍,我上面这个差的太多了。7 n9 S8 n/ v8 c- F( w% n
    " d' ]' y9 \; A* l7 S% j" e# M! M
    我已经完全懵了。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    13#
    发表于 2022-9-25 05:51:23 | 只看该作者
    雷达 发表于 2022-9-25 04:47! L- k, y, _' h% D
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...
    8 l9 a+ H7 I5 I1 s; X1 s9 v
    时间差一倍的结果可以接受。
    0 k: ]# w* i. `; ^6 ]. \& V# n/ z# `. L, t' G$ o+ s1 y0 A+ D
    你还是用profile工具看看吧。现在大家都主观瞎猜。
    回复 支持 反对

    使用道具 举报

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

    [LV.Master]无

    14#
    发表于 2022-9-25 14:58:59 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 15:38 编辑
      K0 s2 U6 m2 ~: i
    雷达 发表于 2022-9-25 04:47
    + T% D$ e  s$ d又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...

    9 }3 ], L) G7 N" ^9 l. S* @5 X6 {3 a- Y+ t+ W, m0 }) P- m! @
    ) u6 Z/ S# a% E" D( {9 Q+ B0 ?

    9 o, a8 p9 P  l: a! q# G# V' t能不能把这个也贴上来,看看和上一个有什么不同?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    15#
     楼主| 发表于 2022-9-26 01:30:03 | 只看该作者
    本帖最后由 雷达 于 2022-9-27 01:17 编辑 + s1 o( ~' h4 b" A; r  l% T
    数值分析 发表于 2022-9-25 14:58. k: K% l$ c+ K  Z" I$ `1 C* q/ ^+ Y
    能不能把这个也贴上来,看看和上一个有什么不同?

    ! V( s0 d* @+ l# r" s8 `理了理思路,重新做了一个测试。
    3 k" |2 S2 v! I+ u( D做了两个 vector 和 两个 float *, 都长 100000; m% f' x) z6 U' B
    外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
    " B  l0 @. N5 G" F& n7 h! K6 T4 ]: M" f% N
    内循环试了4种方法," a! g! x2 [, r9 ~7 f$ V( o
    1. 直接调用 vector inner_product 247s 3 l' U7 X9 M6 X# ^
    2. vector 循环点乘累加 237s$ Q. ~8 w( C$ U5 w2 l& l
    3. float * 循环点乘累加 204s( Q2 }/ u2 c2 M- ], X6 W
    4. 空循环 100000 次 202s
    4 J" I! ~9 x9 k) F  b! @1 a* f
    - n4 m8 x3 l! ^1 k, M  J) l不做内循环 200s- D* M* u9 L$ v9 F

    * {% J& S9 A; }: Y+ c  y你昨天说的对,内循环本身占比是很小的,大头在其他处理。3 x* p2 w8 @/ w1 M. X$ h! A
    另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。$ ~' n# F, D5 {& `/ ~8 l

    % u- W. ]9 i7 I: M* K* K+ v$ X至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
    & T, S5 U: B; s, _1 |# m- [5 v
    / q: y8 i+ B* U4 P4 V+ I9 D" \: v, e; Y3 m; H(为什么下面我贴的  b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成  jj 好了,原来 方括号里的 i 是斜体标志  LOL)3 U( e1 a- m+ T
    $ C$ t8 f9 |/ }; y( G
            std::vector < float > vec1(N);
    9 V9 n. s' [) o+ b6 Y/ ?6 N0 H( Q9 E! H        std::vector < float > vec2(N);6 b! v% y% l2 z! Q$ a1 z+ a4 u: R
            float* b1 = new float[N];; N( V, v# s% s
            float* b2 = new float[N];
    $ s5 t8 r3 L, p
    6 U7 N  ^/ x8 r# m( ~2 h        for (int j = 0; j < 6000; j++), S0 z3 _& s+ S$ Q" E
            {5 @7 a. |4 E# X5 X2 E" {& F
                    std::generate(vec1.begin(), vec1.end(), []() {& s, I2 Z. e: E8 _( s
                            return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
    % z2 w( Z/ h% s9 O- W                        });
    ) @9 x" R% o2 Q& F8 q+ }2 i2 b$ j, t1 [. x, a
                    std::generate(vec2.begin(), vec2.end(), []() {
    8 J( T2 l! q( ~' b" T: q+ w                        return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
    ) j& u/ a0 z& d. {, L! e( Y                        });
    0 [3 C! _! r' e+ a/ v& h, H# u9 j# P' v3 f' d& Y0 M( Z
                    for (size_t jj = 0; jj < vec1.size(); jj++)% I* h. j+ Y  M/ {
                    {5 p9 I" w+ n: W3 A9 n, l; \2 g
                            b1[jj] = vec1[jj];
    * n# A2 S3 i- [, V% T# M8 w                }
    . d6 G! @, O! l3 U  I2 Q' e- a/ P. Z6 m' y) y) z% d
                    for (size_t jj = 0; jj < vec2.size(); jj++)
    ) Q6 \' F1 B% T# n" B                {6 ~& b- @7 ]5 Q, ?8 m; }
                            b2[jj] = vec2[jj];4 x# p9 b7 F$ ^, e! T0 X
                    }
    % i0 |4 |! t! K9 ^* R3 F  [. l
    5 v& v6 ?! i$ b) t' J                //Method - 1  N=100000 247s  
    6 q$ d) ?; k; \$ O) Z0 b                //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
    2 U- a# n$ C3 r9 b7 U; b8 M                                
    : p' a" m$ T9 T2 ?) b( B) T0 R                //Method - 2  N=100000  237s
    + Y0 i2 I+ _0 C" H                /*
    " G# Q% p1 M# Q9 ]                for (int jj = 0; jj < N ; jj++)! v% v3 [, t+ O2 \) p4 e, f  t, \. e, t
                    {
    5 K! @( W8 m# O$ m- j* ^; z0 O- S! J                        fresult += vec1[jj] * vec2[jj];
    0 Y" M" }- ^$ J5 @. M& m$ F! B                }
      h' L8 z6 i6 u6 Z% j! ~. b. H' o                */; a# j5 d+ Z! M0 b, A8 W% b0 h
                                    
    ' o* I4 w, X- O  P9 k/ [' |                //Method - 3  N=100000 204s
    9 [9 Y& {5 T- b9 m' C, D- D                /*
    ; I- t9 j/ ~& c9 x+ W                for (int jj = 0; jj < N; jj++)
    * {6 D8 K6 @, O5 g% D3 Z; a! B                {
    7 [& p: |& Y: n6 G" Z7 h1 d0 r+ `                        fresult += b1[jj] * b2[jj];0 J/ a4 a2 v, S" j$ d3 w8 m6 g4 l
                    }9 p( i. n/ h6 q. r& A0 j
                    */6 J- Q: S$ f" H0 E+ I+ i9 C- t0 y
      C( }4 ~  \% n; w; m6 H
                    //Method - 4   202s$ Q* f- |' o$ V. e( r
                    /*" H1 Z; o* x1 }5 N+ N
                    for (int jj = 0; jj < N; jj++)* G# F/ f, q7 d' _* V5 I% h
                    {, f8 J2 t- V$ u/ e1 [# p, ^
                            & H  X* L& ~5 c# O
                    }
    & d3 e& A6 \/ _3 s                */' c6 J/ ]! {5 j  K& ~( x" I
                    //comment out all methods, N=100000  202s               
    3 [3 ^1 Q. e, F/ A& \        }# u' P- A* ^- ~* h6 n

    % l( j1 E' n/ a        delete []b1;* ^. U. s% @5 m7 L' R* v
            delete []b2;
    9 E: m2 w/ e" S, Y! N3 W" h- b
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    16#
    发表于 2022-9-27 00:15:38 | 只看该作者
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?' K$ H; [# g' ]5 t
    : H8 \. w: ?" G" `  u
    你第二个试验里面的j在循环里面又重新定义了啊,你确定真的跑了6000次?
    . }6 d/ ?6 S! ^
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    17#
     楼主| 发表于 2022-9-27 01:16:03 | 只看该作者
    机器猫 发表于 2022-9-27 00:158 `( Y: K# [0 o; b) N
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?1 R( f0 i! S& e9 E4 s7 S( r8 }
    1 [5 B3 `# P3 ]* V1 e
    你第二个试验里面的j在循环里面又重新定义 ...
    $ ]+ x! g+ w% u8 A8 I, e4 N$ x# `
    内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL
    ! G$ y9 r' L8 E$ k$ D# T- ]0 ^2 X( a- t" {. {
    不和它较劲了,瞎耽误工夫,我已经转到 ubuntu, 也准备顺便试试 avx2 向量化。
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    18#
    发表于 2022-9-27 02:06:58 | 只看该作者
    雷达 发表于 2022-9-27 01:16
    # l- c+ J% Y% Y% w4 d8 N内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL, {- n+ L7 x1 T/ H" _) d
    2 k# g) L$ _8 y  p( K; L
    不和它 ...

    ; l( m5 ~6 d/ I6 Z4 f2 \2 p* R0 H" Q! T8 [/ F
    不过可以试试我说的register变量。前一个试验j是混在一堆其它变量里一起定义的,很有可能是在stack上,这样内存读写会更多,要是再碰上每次都需要加载cache就更慢了。
    / Y( Z5 A+ d' K1 V  A% Y1 V后面一个是在循环那里定义的,说不定编译器就把它优化成register变量了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

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

    使用道具 举报

    该用户从未签到

    20#
    发表于 2022-9-27 20:29:50 | 只看该作者
    雷达 发表于 2022-9-24 23:54& ~2 l; i% n% r0 Y& q, {8 C
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    ! F0 N# X/ _+ ~3 H$ [4 @{
    2 }4 P; z, l, l7 m3 i        comp temp, xtimesy;
    1 Q1 M, f! l/ H- Q" E
    这个code里面如果Openmp没有被注释掉的话,那么temp那个变量应该是定义在循环里面,否则线程之间会存在争夺写入那个temp的风险。- p  _( S" [8 R. \2 k8 }; z; f
    内层for循环如果没有内部操作的话,编译时应该被优化掉了,和你完全注册掉整个循环是一回事。可能你的编译设置没有打开优化?
    " n% U5 g+ ]: G1 ZVS社区版没有问题,我工作用的就是社区版,设置正常的话不会比商业版差。以前游说头头用Intel Compiler,他说不想花钱,而且差不了多少,就一直用到现在。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2026-3-24 07:44 , Processed in 0.063051 second(s), 18 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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