设为首页收藏本站

爱吱声

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

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2022-9-24 22:54:26 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
    C++ 比 Octave 慢好多,怎么破?  g. Q$ \# T# R6 ^  @0 T8 S9 {

    8 m5 O! b/ o5 v9 j自相关两层循环,内层循环涉及浮点数计算,试验了一下把内层循环内部全都 comment out 只留个壳子,  但空的内层循环本身就把速度拉下来了,看来问题并不在浮点计算。0 v9 u* \* m! t- v% U! y' v& a

    6 D4 G8 Z5 c( Z- x速度优化问题真的很有意思啊。' N, ~4 w  ]  W" j) y/ A; f

    % X9 R$ `* ^% F" m4 m( l2 K! a欢迎大家继续讨论

    评分

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

    查看全部评分

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

    [LV.Master]无

    沙发
    发表于 2022-9-24 23:04:16 | 只看该作者
    拉下来?拉多少?  Z& Z$ V- P, Y9 V/ A$ n
    把代码贴上来看看?
    ( n0 h9 m; L$ u( X& T# w% X2 k, ]# M% I4 {4 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 编辑
    ! }' g( o& R) r
    数值分析 发表于 2022-9-24 23:04# q- G) O* l+ T5 `. N: ]+ Z; e
    拉下来?拉多少?5 w+ X( a" M9 W) h
    把代码贴上来看看?
    8 i! r3 {$ W+ t2 Z% v: z9 r

    ; X; V% @/ |/ I# l; @# |) ]  mvoid xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    ' L# c. M6 p1 {- N' G. K# n4 T, e{
    % O% h1 I' D9 r7 q        comp temp, xtimesy;
    ! G; h3 r$ [8 `, K4 V        xtimesy.re = 0;/ z0 g. n5 |( \( ^
            xtimesy.im = 0;/ o) f8 k0 }) Z* ?
            int j0 = lenB - 1;  r! K- y/ b+ N, D- z
            int    i, j, i1, reali;
    ( P2 o4 F6 p8 N# F" K& y) K! {- F+ g        if (lenA % 2 == 1)
    * x& B2 y3 I0 q5 M8 R! ?) m                reali = lenA + 1;
    8 V1 S- ^* E+ @' O        else
    8 V& N- }( P+ ]" J$ @: x                reali = lenA;
    4 v4 `  _  p. `" y& ]        reali /= 2;
    , X8 X: n3 ]9 d* ~9 B1 T, ?
    ' D9 y' W  M0 }8 J0 U( }        int nconv = reali + lenB;
    3 }8 Z3 w/ M+ s# W4 m6 w1 l        //#pragma omp parallel for; U7 z3 \2 y: G6 n  w1 ~0 c, B
            for (i = reali; i < nconv; i++)) Z' E" E, I9 o- P' b% c
            {) o& n: W  G) R" c* L! a
                    temp.re = 0;
    9 V# B2 I. h8 k                temp.im = 0;7 X  n. V. t9 n8 E
                    i1 = i;7 i8 y( D0 _  E
                    for (j = j0; j >= 0; j--)1 @& C' l" n5 H1 N! E
                    {9 @" U- S- f  Q$ o. e2 \: f) N
                            /* floating date operation */
    & m, N8 v  r: w  r! Q3 h' n/ h                }
      o7 J5 o! Q% s% w8 i$ s5 W3 B
            }3 \! z2 o2 w4 U: ^- g% g& [/ ]
    }. ?( s) _3 J* {+ }2 e" w" b  O* \; G3 i
    # b& G/ j% I& G' }0 J) g1 F. x0 N, G0 m
    xcorr函数代码如上,comp是复数struct, 做过长度为11、19两个矢量的测试,和octave结果完全一样: _, q  m7 _- T8 m" b
    & W1 F4 A( g& ^- b* p: a9 G3 N
    红色部分是内循环,现在其内部操作都comment out 了, j0大概是 6000。
    1 |. S0 G7 z% \9 V, u& a/ q现在call xcorr 100次,耗时78s.: P- [. ~5 l4 r% D" o, i/ H! b0 `

    6 U0 T; H4 z; _% W2 W4 s6 e7 p如果把红色部分内循环本身完全comment out, call xcorr 1000次,耗时 <1s.
    + Y8 N- y! `% j% y; H+ M
    0 G) q8 q2 g: h9 e; v
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    6#
     楼主| 发表于 2022-9-25 00:17:17 | 只看该作者
    风雨无阻 发表于 2022-9-24 23:33
    : M& e# J/ N% [  R0 f. a, yMaybe Debug mode?

    2 @5 B2 X7 Q$ x* f
    3 u  V  ^# C9 ?! u' @6 `& x& p不应该,看我上面的回复。. a1 J7 r$ F9 f

    / Q  z- @# S& }3 p我更怀疑是 VS 社区版的问题
    回复 支持 反对

    使用道具 举报

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

    [LV.Master]无

    7#
    发表于 2022-9-25 00:20:10 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 00:24 编辑 * H0 a9 g! S) s- X% o, h6 w
    雷达 发表于 2022-9-24 23:54
    7 |* c' b1 q) e/ b/ _' g) wvoid xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)3 v8 S: f& y9 f) a- g; x/ y$ G$ S
    {% \$ [3 A: |$ Z3 m- ^9 o
            comp temp, xtimesy;
    6 r/ W) F8 `7 n  z
    + W( ?$ w9 N5 b; v5 G; |
    这个不是这么比的吧。。。
    5 S  Z2 ~/ {$ B* |+ _/ q! }( F' H+ O. K
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    ! h2 f) y7 \+ d; K" E& |+ _+ H. V9 _8 Y6 u7 _& n, I$ _
    而加上内循环,光jmp和dec指令就至少多执行了6000个,慢个几十倍不是正常的么?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    8#
     楼主| 发表于 2022-9-25 00:46:56 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 01:09 编辑 . C1 [+ T1 f4 ^$ p" P' K' V
    数值分析 发表于 2022-9-25 00:20: W4 H; ]. z+ A/ w7 N+ i
    这个不是这么比的吧。。。# ^1 ]9 Y5 H6 W' s. s
    - u0 a) W1 Z' r2 W& }
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    ; w5 y6 m! p5 p! R9 ^

    " O' g5 i9 Q) c- a- u有道理。5 f# o+ n: {4 t: X3 G% F5 ^
    所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,记得 numeric 库里有算向量内积的,我回头试试。3 r; f7 d! L/ Z/ k+ ?* |7 ]

    - ^" h0 L7 t% C) f; h! N( T+ M8 R. g我先尝试尽量用标准库,一个小程序,不想搞得太复杂。多谢了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    9#
    发表于 2022-9-25 01:27:53 | 只看该作者
    雷达 发表于 2022-9-25 00:46
    # d9 c, Q: ?6 M1 \! o2 i9 S+ P有道理。) N" H. D1 u. t3 a8 q
    所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,这大 ...
    ( U0 P& v0 L2 W# X" l
    你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子,把循环本身翻译成机器指令loop或dec/jnz,两者速度上会差很多
    " O+ y3 X: D/ k$ x) HWhy is the loop instruction slow? Couldn't Intel have implemented it efficiently?
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    10#
    发表于 2022-9-25 01:48:51 | 只看该作者
    数值分析 发表于 2022-9-25 00:205 D6 i% D0 d5 s# ?* _- ?$ y( [
    这个不是这么比的吧。。。, p6 r9 B# Z; g
    - G  `$ v2 w3 |: i/ s6 w  e# U( V0 |
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    而加上内循环,光jmp和dec指令就至少多执行了6000个

    $ e8 j/ j- S; \/ {! p' E8 Z8 `
    ' S+ T" I) x( T现在的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 编辑 4 Q7 d7 S: H  S8 `- [
    沉宝 发表于 2022-9-25 01:48
    : C5 p) _- ~5 E# ^3 z) C9 _现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果 ...

    ; W' N: i" f* T5 g# a7 }+ Z
    1 w  @% v/ B. b, H是的,兄台说的对。8 b+ L( C: h7 f- z( W
    5 s( K0 U! p; w; t: ]2 S
    其实我想说的是 真正数值计算部分和代码中其他不直接计算的overhead的比值这个事儿。4 i' Y, ?3 U- T5 ]4 E% G6 v

    : b6 M6 {7 E% P. L0 m7 {7 p雷达兄构造测试用例的时候,屏蔽掉了所有计算的部分,使得剩下的都是overhead,这样run time比较的结果就显得好像不合理了。如果把计算加回去,计算部分的run time会dominate,结果就不那么离谱了。因为不好说,所以用指令数对比的方式试图直观地说明这一点。, L. }1 H3 n, m/ N; C
    * j' ~8 z; P, M. w' ]4 a" O
    比如说,如果有计算,那么跑六千个循环相对于计算应该用不了多少时间。但是如果一边是什么都不做,另一边是六千个循环,那六千个循环比什么都不做慢几十倍了,就不是那么不合理了。
    , F0 B; n' k3 }& U, K+ d% p0 P, l0 I5 w$ W4 W. ?/ ^
    当然也有可能像兄台说的,是优化参数的问题,但我觉得更多地是测试用例设计的不合理。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    12#
     楼主| 发表于 2022-9-25 04:47:43 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 04:49 编辑 * {0 [& A" F7 D
    沉宝 发表于 2022-9-25 01:27
    - l( x" b6 ^/ i" Q  h你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子 ...

      g2 ~9 d0 Y9 O0 D3 V. _
    * J6 u! I, X8 ]: s/ Z% W% [又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差一倍,我上面这个差的太多了。
    ; w" Q) |+ Q$ u9 W5 }
    7 J6 A' B0 u8 {* i- |6 ^( A& v我已经完全懵了。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    13#
    发表于 2022-9-25 05:51:23 | 只看该作者
    雷达 发表于 2022-9-25 04:47
    1 D; _9 r$ h5 a  i又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...

    * q  w5 b/ N$ S$ d2 O. m) B5 G0 r时间差一倍的结果可以接受。9 K# F( t) q" ~" x5 f, o

    - ?& w; B0 ]' g/ A. S7 R7 |" D9 d你还是用profile工具看看吧。现在大家都主观瞎猜。
    回复 支持 反对

    使用道具 举报

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

    [LV.Master]无

    14#
    发表于 2022-9-25 14:58:59 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 15:38 编辑 + M' ?* E, q' M& y3 r: g
    雷达 发表于 2022-9-25 04:47
    5 v* \7 f9 V$ F" E# E- S又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...
    7 l! b0 `4 O" w4 d, K% L

    & d7 r  \9 }2 ]" P/ h
    # g1 V: K, e) R# V; `) Y6 }- i7 c' C/ x# V% L- b
    能不能把这个也贴上来,看看和上一个有什么不同?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    15#
     楼主| 发表于 2022-9-26 01:30:03 | 只看该作者
    本帖最后由 雷达 于 2022-9-27 01:17 编辑
    8 v* Q: f: q6 q4 U0 w
    数值分析 发表于 2022-9-25 14:58* p0 E5 n* I6 F' U' ^. M9 u+ V. M/ a
    能不能把这个也贴上来,看看和上一个有什么不同?
    - T) S; m3 E( D6 v2 v) f7 m! a
    理了理思路,重新做了一个测试。
    0 ]9 |: _2 i# X% ]: {. @& p, l做了两个 vector 和 两个 float *, 都长 100000
      D% j3 i$ Q( x# k/ M外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
    9 L# r4 d8 U  {) s* ?% h* R5 D3 D: t1 h4 b( J% F& J7 z$ N4 P
    内循环试了4种方法,% a2 E, g: Y: j: x6 t! c
    1. 直接调用 vector inner_product 247s . O  Y: M. Y! B9 S2 x  n" R
    2. vector 循环点乘累加 237s
    . \3 s  d8 T4 ~8 @1 ]% Z3 r3. float * 循环点乘累加 204s
    + u) [9 F3 {# Q7 g& p" a7 D/ m4. 空循环 100000 次 202s. z/ P) V, a& r( U% |' N
    0 R2 h/ r. o6 n5 j* [* F; V
    不做内循环 200s
    1 `8 z# o- H, o! G3 ?$ ~  x+ F8 r. V/ U- L$ m7 f: A
    你昨天说的对,内循环本身占比是很小的,大头在其他处理。9 v) Z7 d6 B9 @& j2 L. [  ^/ w
    另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
    & n% z& C( Q! s3 M2 T) I: ]- @% L. u% \4 V8 ]: M
    至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
    , F. P8 z1 W* s. R
    ' S; {! \/ }  u& B(为什么下面我贴的  b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成  jj 好了,原来 方括号里的 i 是斜体标志  LOL)
    7 e9 r4 H% x1 h7 v7 H, D0 A9 `  _8 v+ c' ^  {9 K/ r" ~! D
            std::vector < float > vec1(N);* Q4 }! [& w0 `  Z+ d* i# i
            std::vector < float > vec2(N);
    # Z0 M+ o) t, P        float* b1 = new float[N];
    0 |# R4 S; @1 i/ a$ q0 w        float* b2 = new float[N];# V) v( c+ _4 u* C+ ?7 ]! u  h
    ! M% a- w$ P: G
            for (int j = 0; j < 6000; j++)8 M2 b9 A: P" z& c+ r  o
            {
    , `: j8 }9 s6 f! v/ H0 ]                std::generate(vec1.begin(), vec1.end(), []() {1 {; W+ L* y. Y3 b& W
                            return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
    3 m! g4 D% K( ?$ m/ F* |                        });8 N2 I9 G- U$ A
    ! b5 R. N0 m* d3 q' L8 y
                    std::generate(vec2.begin(), vec2.end(), []() {3 C0 }* M& e+ l0 ^
                            return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
    * b2 ~2 b1 M! @                        });
    / F7 l: z/ c$ c- o% R8 P
    2 V" I5 l! W$ O! z: ~( }$ [/ Y% e" e& Z                for (size_t jj = 0; jj < vec1.size(); jj++)$ h) X' C$ {# l! U, P- i" G
                    {! M- T( L  T2 p" K
                            b1[jj] = vec1[jj];
    3 m: m9 {1 O9 m0 U3 J2 x$ H                }. E# k* O, q+ r5 V( l

      r6 U% c# j) f( V5 K& M                for (size_t jj = 0; jj < vec2.size(); jj++)
    . R- ]8 t9 P0 I# q9 U6 u! ?  m                {
    1 P- n' q1 A, j# S% w, ]; x3 a: S# N                        b2[jj] = vec2[jj];
    : T& o. }% M3 i6 O                }* n% \# x$ x0 h9 o7 |

    + ]) m% M5 i& u0 ]6 F0 [+ R                //Method - 1  N=100000 247s  ( n: s: }9 F" d& d& d: F3 g- e3 _
                    //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);3 q& z, `& f0 k5 C
                                    
    ) `' W; A9 z! j  U+ X1 F8 a                //Method - 2  N=100000  237s5 e9 _) P$ j) Q+ @2 {' S: Q& i5 r
                    /*0 h7 I- Y9 s1 U$ ~2 I' [
                    for (int jj = 0; jj < N ; jj++)
    * b5 d1 }9 h" s5 a2 ~8 Y0 Z                {$ v( U. h' x. W3 y/ X
                            fresult += vec1[jj] * vec2[jj];; H& U7 N1 C1 r- `
                    }
    + E0 D/ \0 l- h0 k* |- }4 g                */
    ! L. ^* L2 R  ^6 V  e                                4 y8 R& e5 ]- R7 K& v+ Z% Z
                    //Method - 3  N=100000 204s) o+ Z6 V3 A. C& W. ?5 ?/ o: R
                    /*
    ) G3 R; i1 P& a3 L* F4 m' |/ C, J                for (int jj = 0; jj < N; jj++); \3 R! g* G$ p* K, }; H; u7 r
                    {
    , m) j$ k* @( k' C                        fresult += b1[jj] * b2[jj];
    " w7 A, S+ v) B3 h' z& t" ~                }
    ! m( a% O, B5 I, S6 M. C& j                */0 {+ c$ v" n6 @7 t

    % v6 e$ P/ I5 o4 _# f  j6 k                //Method - 4   202s5 B$ C6 L. z" k' \/ W* x
                    /*
    3 v  v( a/ Q3 H4 v& A9 f0 o5 _7 B                for (int jj = 0; jj < N; jj++)
    $ J) V' W0 G2 A/ r% l; q) q                {$ g) ~8 {% O% y7 L: }. I4 f
                            ! S* y( z' d& k9 P& ]8 f8 Z  R% X% Y
                    }9 u/ A  Y8 A. l$ x# ^; W% w' Z
                    */5 X8 h2 F0 n: d6 P% I" x3 r& k
                    //comment out all methods, N=100000  202s                ' _; y7 w6 r1 W! g/ Q* i0 C
            }. l& R. D7 y( S$ C: O- o' b8 T

    8 T& J* U7 a5 B  [) a9 H        delete []b1;; f+ q5 [$ m* u8 F
            delete []b2;
    : G6 a$ n+ }  z- M  D' g
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    16#
    发表于 2022-9-27 00:15:38 | 只看该作者
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?
    " `: b# d& q- A# m
    ' ]  _- b0 \6 r你第二个试验里面的j在循环里面又重新定义了啊,你确定真的跑了6000次?
    9 s7 q+ D& R0 ^( U: O, K
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    17#
     楼主| 发表于 2022-9-27 01:16:03 | 只看该作者
    机器猫 发表于 2022-9-27 00:15  O" ^  g% N! }( Z& H
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?
    , s/ J7 E* m- x" j9 X9 P+ V5 a# `# }! P6 a
    你第二个试验里面的j在循环里面又重新定义 ...

    : N) C' Y9 J3 k- [3 P: `: A内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL
    2 U$ I9 }# h8 a$ d
    8 `. j5 z. U$ o# v5 L! ^" w! t不和它较劲了,瞎耽误工夫,我已经转到 ubuntu, 也准备顺便试试 avx2 向量化。
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    18#
    发表于 2022-9-27 02:06:58 | 只看该作者
    雷达 发表于 2022-9-27 01:16
    6 C6 W' T& w  ]1 O内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL
    6 `" M" p' ~" V+ M9 ~% r3 z3 _3 F; ?! ^' J% V! Z
    不和它 ...
    7 P$ B( Z5 D5 q/ F7 n8 C
    9 W, A. R6 V- j, Q
    不过可以试试我说的register变量。前一个试验j是混在一堆其它变量里一起定义的,很有可能是在stack上,这样内存读写会更多,要是再碰上每次都需要加载cache就更慢了。
    & G: K( P, Z. d% Z4 u% ^后面一个是在循环那里定义的,说不定编译器就把它优化成register变量了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

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

    使用道具 举报

    该用户从未签到

    20#
    发表于 2022-9-27 20:29:50 | 只看该作者
    雷达 发表于 2022-9-24 23:54
    , B% e2 X) A/ f6 h/ w3 \6 Zvoid xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    6 w$ w! W3 W' |6 m8 p& ~{. {# b- r9 e- N, a# F
            comp temp, xtimesy;

    5 j( h+ r6 V3 [这个code里面如果Openmp没有被注释掉的话,那么temp那个变量应该是定义在循环里面,否则线程之间会存在争夺写入那个temp的风险。% c7 d& G* d6 t2 J
    内层for循环如果没有内部操作的话,编译时应该被优化掉了,和你完全注册掉整个循环是一回事。可能你的编译设置没有打开优化?
    & \/ o) R- U& R2 yVS社区版没有问题,我工作用的就是社区版,设置正常的话不会比商业版差。以前游说头头用Intel Compiler,他说不想花钱,而且差不了多少,就一直用到现在。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2025-11-26 12:54 , Processed in 0.046739 second(s), 21 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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