设为首页收藏本站

爱吱声

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

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

[复制链接]
  • TA的每日心情
    奋斗
    2024-3-29 05:09
  • 签到天数: 1180 天

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2022-9-24 22:54:26 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
    C++ 比 Octave 慢好多,怎么破?: s4 ?, D( G# _

      i3 Z5 N7 L2 k5 y! p自相关两层循环,内层循环涉及浮点数计算,试验了一下把内层循环内部全都 comment out 只留个壳子,  但空的内层循环本身就把速度拉下来了,看来问题并不在浮点计算。* M; k" {% M' z4 ?; l6 n3 B+ ?
    ! A  ~: }: E; _* O. H% w
    速度优化问题真的很有意思啊。
      I, ]+ X4 x" P4 d* {$ Y7 N+ d" H# {% t+ |& Z
    欢迎大家继续讨论

    评分

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

    查看全部评分

  • TA的每日心情
    开心
    昨天 07:33
  • 签到天数: 1646 天

    [LV.Master]无

    沙发
    发表于 2022-9-24 23:04:16 | 只看该作者
    拉下来?拉多少?" c. T# a/ ~1 u% s6 j4 C
    把代码贴上来看看?( P% h/ P- B3 M+ e- i# t

    ( p( D" B  f. U$ A( U6 A+ m* E0 g难道分支预测不准破坏流水线执行?不该啊。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    板凳
    发表于 2022-9-24 23:15:41 | 只看该作者
    会不会代码本身的缺陷阻止了自动优化?另外,硬件配置和开发环境可能也有关系。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2024-4-22 03:36
  • 签到天数: 120 天

    [LV.7]分神

    地板
    发表于 2022-9-24 23:33:02 | 只看该作者
    Maybe Debug mode?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2024-3-29 05:09
  • 签到天数: 1180 天

    [LV.10]大乘

    5#
     楼主| 发表于 2022-9-24 23:54:10 | 只看该作者
    本帖最后由 雷达 于 2022-9-24 23:57 编辑
    % Y8 m$ b% f7 S! a9 {8 o/ i
    数值分析 发表于 2022-9-24 23:04' T! D* B3 r0 M' J4 @, d6 z9 H7 E
    拉下来?拉多少?
    / h% O3 g0 z  ^* S: c把代码贴上来看看?
    6 L5 D  n' L0 t6 k3 V# z1 |2 K, G
    " ~2 i, Y& ^; q! }  [: `4 o
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    - D6 }% d3 Y/ P5 h2 d5 J{
    2 j0 N, a, _$ V9 \        comp temp, xtimesy;
    5 H8 ?' [3 L2 J7 o# w0 d% @  `# b        xtimesy.re = 0;* ?8 G$ `: q+ n3 S% o
            xtimesy.im = 0;
    ; a' \9 N8 ]) H' N        int j0 = lenB - 1;
    3 ~3 r% b( }0 z. Y- Z        int    i, j, i1, reali;
    . g2 K  v2 Y3 b; R        if (lenA % 2 == 1)0 ^* [: g, U2 V5 f: m* K8 I4 r  U
                    reali = lenA + 1;1 t, ?; H) @9 K' w" B- a; U0 P
            else
    % j! H5 r, z, h( i                reali = lenA;& D$ H/ z: q5 Y2 T6 }$ E& Z
            reali /= 2;. u$ ]8 H( z3 t6 f1 W6 I- \9 V

    9 ]: m) P7 r$ e* W  ~. j        int nconv = reali + lenB;
    $ t: C9 ~6 U/ }8 u! Q        //#pragma omp parallel for$ b" a; K; O: H# w7 v' b
            for (i = reali; i < nconv; i++)
    1 u& {/ K: L$ J8 Q        {
    : ?, V  o8 L0 ?- D- S# K                temp.re = 0;
    . m4 \, @1 E7 `# R                temp.im = 0;
    * N; P. S6 i' b1 x                i1 = i;" N, w* J3 k0 ]; D8 C: |! m
                    for (j = j0; j >= 0; j--). A4 q$ a0 S3 s; A' N: J. \
                    {+ S& L4 t( L" x! O
                            /* floating date operation */
    6 A  o* \0 }' U" A3 M; F/ G                }
    / v* b7 ^$ d& n
            }
    7 ]* `* a$ H: V$ f}$ u+ J9 p$ u( V3 l8 X8 j

    9 z( e7 A" s6 S  Hxcorr函数代码如上,comp是复数struct, 做过长度为11、19两个矢量的测试,和octave结果完全一样' L4 A  |2 ^. R# L% e" z2 i
    " k% N2 q1 {' j! ]
    红色部分是内循环,现在其内部操作都comment out 了, j0大概是 6000。
    8 E  J' I1 _, t5 x9 L: \7 M) |6 C现在call xcorr 100次,耗时78s.
    + K3 H% }( s% R3 F
    ' P' l+ G5 \. p" k如果把红色部分内循环本身完全comment out, call xcorr 1000次,耗时 <1s.
    / E: |: Z& f6 @: w, c
    0 j9 @) {* j$ U
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2024-3-29 05:09
  • 签到天数: 1180 天

    [LV.10]大乘

    6#
     楼主| 发表于 2022-9-25 00:17:17 | 只看该作者
    风雨无阻 发表于 2022-9-24 23:33
    % _1 c' S1 H- F: i! l' HMaybe Debug mode?

    ) u3 N9 G' n6 s/ T, [& L) k2 K; Y8 K7 V. b. _$ M: I" c( t
    不应该,看我上面的回复。4 p. f4 r# b* V$ q" I+ l
    / X! Q4 g5 t& g7 W; k( M9 E
    我更怀疑是 VS 社区版的问题
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    昨天 07:33
  • 签到天数: 1646 天

    [LV.Master]无

    7#
    发表于 2022-9-25 00:20:10 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 00:24 编辑 4 h# a. r# @; v$ o" b+ C
    雷达 发表于 2022-9-24 23:54
    # Q  A+ G, w4 c* ]' P. `! wvoid xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)& Y/ ?6 z$ F* K* P6 |8 i. [
    {0 Q8 X" \" y( e  ~  B; L
            comp temp, xtimesy;

    % f8 ^3 O1 d3 s. P$ J/ F& A) |# H6 R. {! P; D8 X1 h
    这个不是这么比的吧。。。, ?8 e3 p0 v- K" p2 J5 f$ a& h- l, ~3 g

    3 B* ]' E$ L# j2 I您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。: I! N/ G3 g4 \( q0 i! y/ m" N
    + O4 W; y3 O# B- d% g; V
    而加上内循环,光jmp和dec指令就至少多执行了6000个,慢个几十倍不是正常的么?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2024-3-29 05:09
  • 签到天数: 1180 天

    [LV.10]大乘

    8#
     楼主| 发表于 2022-9-25 00:46:56 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 01:09 编辑 $ Q; u% |* R  T4 v% }
    数值分析 发表于 2022-9-25 00:20% R: N, _. x3 G9 z0 ~& B7 |
    这个不是这么比的吧。。。
    & B) W% A2 k/ v% p' j# A8 ]/ e5 L, d( i
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。

    $ {( t$ B4 `/ t. `+ s  k0 n# n4 m6 K, [9 b% v; @9 g1 h( a2 `& ?
    有道理。
    # y) ~% s& c- D7 m/ J) k, k  e所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,记得 numeric 库里有算向量内积的,我回头试试。, x, V1 j; b# G
    % {5 E/ _$ U" f
    我先尝试尽量用标准库,一个小程序,不想搞得太复杂。多谢了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    9#
    发表于 2022-9-25 01:27:53 | 只看该作者
    雷达 发表于 2022-9-25 00:46
    + r+ }5 f& ~  ^% h/ Y9 ]有道理。
    & j) O5 a( E( E' A所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,这大 ...

    7 @$ p1 ~9 r6 {6 O9 }你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子,把循环本身翻译成机器指令loop或dec/jnz,两者速度上会差很多! ^  u$ m+ F3 _7 b$ V4 W, x
    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
    ) ^( v5 S0 C5 {6 v9 R' L这个不是这么比的吧。。。5 w* Q: [2 J# ]) E( y8 A" o

    ! A" H# k+ K* l您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    而加上内循环,光jmp和dec指令就至少多执行了6000个

    8 g$ S. w! p! T! w; N5 }+ F2 m2 ^  ^
    % o7 D: m1 M" q% n现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果循环这样跑,花不了多少时间。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    昨天 07:33
  • 签到天数: 1646 天

    [LV.Master]无

    11#
    发表于 2022-9-25 02:06:44 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 02:16 编辑
    / x9 a$ Z% j  d; O* t4 k% ?3 [) g
    沉宝 发表于 2022-9-25 01:481 }2 V8 C$ z  u
    现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果 ...

    7 X' O0 S7 q7 @6 @4 [" b% e8 H
    * K  t) G# Q* q2 e4 p; Z) Y是的,兄台说的对。- A5 h1 S# I! s+ }

    1 B, W! j4 J- a其实我想说的是 真正数值计算部分和代码中其他不直接计算的overhead的比值这个事儿。! N1 W' V$ ]( }% k" a% h, g

    " m6 Y& r# {: j8 d- ?! _雷达兄构造测试用例的时候,屏蔽掉了所有计算的部分,使得剩下的都是overhead,这样run time比较的结果就显得好像不合理了。如果把计算加回去,计算部分的run time会dominate,结果就不那么离谱了。因为不好说,所以用指令数对比的方式试图直观地说明这一点。9 o: Q- S" [( G& V  ~$ \) ~

    . u0 n, K1 P8 U; t/ S9 V$ z比如说,如果有计算,那么跑六千个循环相对于计算应该用不了多少时间。但是如果一边是什么都不做,另一边是六千个循环,那六千个循环比什么都不做慢几十倍了,就不是那么不合理了。1 j0 H' C$ r$ I3 f
    . d4 @, p' G' t# u) v, X" U
    当然也有可能像兄台说的,是优化参数的问题,但我觉得更多地是测试用例设计的不合理。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2024-3-29 05:09
  • 签到天数: 1180 天

    [LV.10]大乘

    12#
     楼主| 发表于 2022-9-25 04:47:43 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 04:49 编辑 , ~' X! j# N, ~; i9 u, ]( m9 F
    沉宝 发表于 2022-9-25 01:27
    + H: w! U. J1 [  R4 _, ?* O' [你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子 ...

    0 D4 ~' |! |0 \( [2 w- L& @5 A, s5 c5 D
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差一倍,我上面这个差的太多了。
    " g" W9 f& n/ ^! o$ v: p8 r+ R0 q* ?8 |& @- J
    我已经完全懵了。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    13#
    发表于 2022-9-25 05:51:23 | 只看该作者
    雷达 发表于 2022-9-25 04:47
    ) h5 {7 l. K- X  n: V/ e; v又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...

    8 C! ^$ t, y% V& h& Q4 j时间差一倍的结果可以接受。
    * q) D! B! I; a+ N% a  T5 P' w; N* m
    你还是用profile工具看看吧。现在大家都主观瞎猜。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    昨天 07:33
  • 签到天数: 1646 天

    [LV.Master]无

    14#
    发表于 2022-9-25 14:58:59 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 15:38 编辑
    , r8 l" ~4 w+ N) _! F6 H
    雷达 发表于 2022-9-25 04:47, S# L% w. Q" ]. k+ D5 H
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...

    0 o& \: R) i, L) \+ R, r) O4 p9 U' {2 v, @- `! c
    . f  J1 @* d" h0 E, ~) v! t
    / a% x5 ], E$ C" n, \/ m
    能不能把这个也贴上来,看看和上一个有什么不同?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2024-3-29 05:09
  • 签到天数: 1180 天

    [LV.10]大乘

    15#
     楼主| 发表于 2022-9-26 01:30:03 | 只看该作者
    本帖最后由 雷达 于 2022-9-27 01:17 编辑
      k$ _/ l5 C* Q8 e
    数值分析 发表于 2022-9-25 14:589 R' {, f, x) }  z* f
    能不能把这个也贴上来,看看和上一个有什么不同?

    / ^9 e5 {4 c% w5 s7 Z, [理了理思路,重新做了一个测试。
    ' Q; B. L% H6 u  ^' X做了两个 vector 和 两个 float *, 都长 100000: c9 ~; Q  R1 s: z
    外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.8 y% C: X# B4 d9 K# ~& Y* n
    ( A. Q  C4 ^* r+ \9 q6 k0 o3 o( ^+ |% O
    内循环试了4种方法,
    3 a6 ]" x9 a/ p9 L6 u" E1. 直接调用 vector inner_product 247s 6 X$ _( f: M8 x5 w8 A
    2. vector 循环点乘累加 237s5 T3 g& B" ~- \: G! t& e" B
    3. float * 循环点乘累加 204s
    ' d6 L# G( n1 ~4. 空循环 100000 次 202s
    0 ]% C5 g( ~0 g# E# K' z8 a0 z. P/ g( k5 }9 L2 r" T( m+ C* r
    不做内循环 200s) d" A9 v) H& w+ V- Z( h( y* f7 C+ W
    * b. O) F9 ~5 u$ g4 u" W
    你昨天说的对,内循环本身占比是很小的,大头在其他处理。: A$ N& o7 J& s4 Z
    另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
    ' v2 C; d! h$ a6 p" ?: n& Z2 w- o! G9 E+ [
    至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)8 [" R* _0 ]1 {0 i' x

    ' T8 q2 h7 r* |  I. N(为什么下面我贴的  b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成  jj 好了,原来 方括号里的 i 是斜体标志  LOL)
    . u& @& g5 w3 \, ]/ P: u" n2 T) G
    ' p# s( y/ a2 @: g) s* [' P0 ~* @6 R
            std::vector < float > vec1(N);9 ]3 ^9 w/ i4 z) a' v
            std::vector < float > vec2(N);
    * S) I' N6 u! g        float* b1 = new float[N];" n) b2 R( p- Z% [/ A  K
            float* b2 = new float[N];
    " r& v2 x6 `- a, Z- l/ d  t
    + _9 u" U" d! s3 [* ~# w( p  S        for (int j = 0; j < 6000; j++)
    * L8 K1 x5 @" B0 V        {& @: g: L8 M) |1 x2 R2 N) p
                    std::generate(vec1.begin(), vec1.end(), []() {' s3 b1 k& J4 n$ v6 ~' ^. D4 y. o
                            return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;$ O$ ^. m( D  q8 R; S6 Z  {
                            });
    0 T1 d( F3 H. T
      [. c' Z5 r3 `1 b/ o                std::generate(vec2.begin(), vec2.end(), []() {5 [& [2 e: u8 z
                            return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
    9 k0 E) }/ [9 S9 B3 E                        });5 E" n1 x! ]0 C; Z) q1 z

    9 I$ j3 l/ \, M- g& Z) _) z                for (size_t jj = 0; jj < vec1.size(); jj++), x3 {9 Y0 @; `2 }$ ~9 e8 v
                    {1 ^6 f, M$ M+ Z8 l5 U
                            b1[jj] = vec1[jj];
    , Q# S4 H; i  j$ a# }5 t                }4 ~$ Q$ f# k0 M: C

    8 _4 d& L; J& j& S5 o( O% k                for (size_t jj = 0; jj < vec2.size(); jj++)
    4 B5 X% O% N: C5 x& L! ^7 t3 h                {! y( V4 a' k+ D) ~& M( Y( k" o
                            b2[jj] = vec2[jj];7 {  S4 ^& f4 m+ f; f5 @
                    }
    3 w5 Q( j2 ~6 R! ?
      u9 c- b/ }8 c( ?) t                //Method - 1  N=100000 247s  $ \" H- e5 ^" a  g/ M5 h0 ^
                    //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);8 {3 |5 L$ B1 C
                                    9 f" V% f6 P5 p4 f
                    //Method - 2  N=100000  237s0 ~, ~5 A3 [, z$ ^0 ]4 G8 |
                    /*9 O7 \: U9 \' C/ Q9 a  V
                    for (int jj = 0; jj < N ; jj++)
    5 t5 g7 H! r1 W, Q                {9 g# ~0 a. J! j; |8 p1 n
                            fresult += vec1[jj] * vec2[jj];* n# p9 B3 T4 A% @  `3 ?6 o, r3 r
                    }
    7 u- }  K) w1 w* s5 `& R2 m- |* o# I                */6 g) @0 c& x' j% L6 b  l, `) h9 p
                                    
    # R' K: S* W3 X* ~& T2 i                //Method - 3  N=100000 204s
    8 k  w$ e' B9 Z: ~4 G                /*
    5 \8 U( R$ q" b1 |/ J                for (int jj = 0; jj < N; jj++)) p  J2 @. a3 T* Q# _, n" [9 e
                    {0 a' u, {/ G( E( i5 z/ m
                            fresult += b1[jj] * b2[jj];
    - M: `0 J! u3 M+ P                }
    1 c1 w. v9 ?7 r! c% }* y8 S! D                */
    4 g/ W) r% F/ i- r# y, D, i. o6 @$ O; Z; `9 b3 V* v8 N, R8 a) |
                    //Method - 4   202s' ^! C8 _$ S, |: B$ D7 \* [
                    /*
    8 N" m) d/ C1 A$ X2 V- Z1 ^/ T6 ~                for (int jj = 0; jj < N; jj++)$ z. l0 _3 W+ ~
                    {! U# z" r) ~! [. a; e
                            
    ; `  T+ c; D6 v8 U$ f. F* g                }! ?& s- Y+ J9 A0 m3 C" w8 f9 F
                    */: v; \! H3 A) b# N8 L2 S, |. d
                    //comment out all methods, N=100000  202s               
    * a! n* w: N, c$ A        }
    : q3 M; T) p8 i6 F9 |$ c
    3 n$ a1 C$ V; ^4 b        delete []b1;' J6 \$ D6 ?9 d! u/ Z* i/ h
            delete []b2;

    - @' c/ i! _1 ^- [5 B' ^+ W
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    16#
    发表于 2022-9-27 00:15:38 | 只看该作者
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?
      O4 s% y% k* }( v" ^0 \, L# v$ X% N2 d5 m
    你第二个试验里面的j在循环里面又重新定义了啊,你确定真的跑了6000次?6 H* a4 H, R1 f9 d5 B: o0 \
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2024-3-29 05:09
  • 签到天数: 1180 天

    [LV.10]大乘

    17#
     楼主| 发表于 2022-9-27 01:16:03 | 只看该作者
    机器猫 发表于 2022-9-27 00:15
    ! Q/ ]( W7 `5 @0 b% p瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?
    * H& y7 V, c1 h! C" S6 Z4 w# j8 s" E5 g8 H: ^9 Z4 h3 W
    你第二个试验里面的j在循环里面又重新定义 ...
    ) q1 A+ h; y' i6 E. b4 T# Q9 R
    内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL5 |& h; W1 f+ t# n# q

    7 [0 O5 R6 r4 u% W# d$ y不和它较劲了,瞎耽误工夫,我已经转到 ubuntu, 也准备顺便试试 avx2 向量化。
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    18#
    发表于 2022-9-27 02:06:58 | 只看该作者
    雷达 发表于 2022-9-27 01:16
    3 U  T" g% w6 ]/ u" U& Z7 q/ u4 Y0 i内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL9 V" U4 p( @$ L6 L) z; o9 k
    * F; d2 H7 R% K  x* V; W' p0 e) h
    不和它 ...

    # P& d  Q; U0 E. g
    5 t% {) x7 ]2 B不过可以试试我说的register变量。前一个试验j是混在一堆其它变量里一起定义的,很有可能是在stack上,这样内存读写会更多,要是再碰上每次都需要加载cache就更慢了。
    $ I$ N$ y, {8 Z8 e1 p! H+ J  z1 z后面一个是在循环那里定义的,说不定编译器就把它优化成register变量了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

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

    使用道具 举报

    该用户从未签到

    20#
    发表于 2022-9-27 20:29:50 | 只看该作者
    雷达 发表于 2022-9-24 23:544 C( J  x) O3 l. D' }4 ?
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    ) k6 |# P! T: t6 x{, i' m8 ?$ [* I2 @" ^
            comp temp, xtimesy;
    & v/ w' p) b9 y* Q4 H7 P
    这个code里面如果Openmp没有被注释掉的话,那么temp那个变量应该是定义在循环里面,否则线程之间会存在争夺写入那个temp的风险。5 @" ]/ k) Q1 v
    内层for循环如果没有内部操作的话,编译时应该被优化掉了,和你完全注册掉整个循环是一回事。可能你的编译设置没有打开优化?: z- [4 {9 C5 ]; G! G, F
    VS社区版没有问题,我工作用的就是社区版,设置正常的话不会比商业版差。以前游说头头用Intel Compiler,他说不想花钱,而且差不了多少,就一直用到现在。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2024-5-5 00:43 , Processed in 0.049535 second(s), 19 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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