设为首页收藏本站

爱吱声

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

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

[复制链接]
  • TA的每日心情
    擦汗
    2024-12-25 23:22
  • 签到天数: 1182 天

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2022-9-24 22:54:26 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
    C++ 比 Octave 慢好多,怎么破?
    4 x6 n% z  d; h( y
    ! F# Y4 [/ |2 m. D$ m自相关两层循环,内层循环涉及浮点数计算,试验了一下把内层循环内部全都 comment out 只留个壳子,  但空的内层循环本身就把速度拉下来了,看来问题并不在浮点计算。
    ; ~$ B7 U# R4 T# Y/ B5 A
    % P" C7 |) r1 p速度优化问题真的很有意思啊。
    6 {# ^8 @  R7 w: T
    0 g) K) n; w5 j4 R) n0 O% P: D! E/ p7 [欢迎大家继续讨论

    评分

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

    查看全部评分

  • TA的每日心情
    开心
    3 小时前
  • 签到天数: 1928 天

    [LV.Master]无

    沙发
    发表于 2022-9-24 23:04:16 | 只看该作者
    拉下来?拉多少?3 q) k1 d9 {- `$ A
    把代码贴上来看看?5 U/ @) P7 D  o2 R

    . W, E; g2 A! Z$ G5 G" @5 c, p" i# ^难道分支预测不准破坏流水线执行?不该啊。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    板凳
    发表于 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的每日心情
    擦汗
    2024-12-25 23:22
  • 签到天数: 1182 天

    [LV.10]大乘

    5#
     楼主| 发表于 2022-9-24 23:54:10 | 只看该作者
    本帖最后由 雷达 于 2022-9-24 23:57 编辑
    1 \0 H! E$ c8 Q7 d/ _$ q
    数值分析 发表于 2022-9-24 23:04
    # g2 v! F- g- j* E拉下来?拉多少?
    0 V6 O3 X4 o. z( Q$ z把代码贴上来看看?
    7 f6 y: t3 F) \! z& a
    . c/ W# c$ F) b. \( E5 Q
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)) j0 M# p3 w) P4 F2 i8 q+ T
    {
    , I& Q$ @( Z) R' A7 [1 ?        comp temp, xtimesy;* m; {) a7 t+ `1 a9 T9 r
            xtimesy.re = 0;
    % U. ~3 E) H: i' z7 Z        xtimesy.im = 0;8 o! ?6 Z! M- C' D: y( B* ?
            int j0 = lenB - 1;* `- d" f/ V8 \8 R/ `$ q6 E* W
            int    i, j, i1, reali;
    , w2 S" S  ~( f+ a        if (lenA % 2 == 1)6 J. _7 N( B6 c8 v
                    reali = lenA + 1;8 i2 ^( p' X/ E2 W, P* e
            else
    , B" O5 d2 i+ p; r" A! ^                reali = lenA;  B% ~) S. Q; `
            reali /= 2;
    , E; ^# B0 U3 t: O. `: ^3 o% d$ }& _2 F( x7 O. W
            int nconv = reali + lenB;
    1 ~- [. l+ p* \2 X        //#pragma omp parallel for! h0 V* k1 s6 }( g
            for (i = reali; i < nconv; i++)
    ( [* T% [& k) K& Z2 m        {
    % A2 i+ U( p" q% ~0 a) R! G                temp.re = 0;$ O% s0 H3 h5 e
                    temp.im = 0;
    4 Z+ r7 C6 i5 m                i1 = i;
    3 i. {9 n. x' t                for (j = j0; j >= 0; j--)" ~  p6 I( c+ t  a  G8 A
                    {  i) K: X/ e/ i0 Q
                            /* floating date operation */9 Y5 q0 m2 e5 [) T+ x4 ?
                    }
    & Z$ b# m4 U2 ]
            }1 D" e3 g: o3 _' g/ V
    }  l5 ]1 u) K- d( W2 W" E' n1 a! U$ t

    4 S$ Q, i0 }: E  j, G0 u. Oxcorr函数代码如上,comp是复数struct, 做过长度为11、19两个矢量的测试,和octave结果完全一样/ ^% C. v6 b; H, y9 a, H& n

    $ ^! G& d! r8 _3 c$ S8 ]( @  }红色部分是内循环,现在其内部操作都comment out 了, j0大概是 6000。9 s1 s' Y. b9 E& O8 G8 M/ K/ r9 l6 H( k) F
    现在call xcorr 100次,耗时78s.
    2 h7 y/ `  y7 R9 F) Z) |# a1 h9 U" L2 a1 |0 t, Z" ?: e! B
    如果把红色部分内循环本身完全comment out, call xcorr 1000次,耗时 <1s.
    ; b; ~. p3 a$ u5 `1 C7 R7 E# b
    $ f& O2 p( U8 a0 k! |4 s
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    擦汗
    2024-12-25 23:22
  • 签到天数: 1182 天

    [LV.10]大乘

    6#
     楼主| 发表于 2022-9-25 00:17:17 | 只看该作者
    风雨无阻 发表于 2022-9-24 23:33
    7 M- j0 J' b; M$ O, M1 i; TMaybe Debug mode?
    ( H9 v) L! x* P4 N5 W3 o% \
    3 m  _" B% E! p* Z
    不应该,看我上面的回复。
    ; _3 I8 Q; r5 G. Y( y
    & O1 @1 }& y* d, X! ]% V  `6 O我更怀疑是 VS 社区版的问题
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    3 小时前
  • 签到天数: 1928 天

    [LV.Master]无

    7#
    发表于 2022-9-25 00:20:10 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 00:24 编辑 4 V0 z, x! I- c( {7 K& h6 t+ A  U
    雷达 发表于 2022-9-24 23:54+ t5 g1 }  ?4 O" T1 J( P4 E
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)0 P; N  w- ?! f0 F# e* {1 I
    {
    ; w1 ?1 F3 _1 T7 ]8 w        comp temp, xtimesy;

    - j$ T- K/ g3 @2 J; }) f
    2 E3 g. J7 q: g" o  r+ H这个不是这么比的吧。。。' Y# w6 }6 }2 A
      m2 @0 U1 H, G0 v8 ^- a- e: @* V, n: P
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    ! D4 V$ l0 ~& l' Y6 b2 {$ v4 r" V( n. D) Y3 W( n+ y
    而加上内循环,光jmp和dec指令就至少多执行了6000个,慢个几十倍不是正常的么?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    擦汗
    2024-12-25 23:22
  • 签到天数: 1182 天

    [LV.10]大乘

    8#
     楼主| 发表于 2022-9-25 00:46:56 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 01:09 编辑
    ; l1 |& H% t5 ]. f; p& [$ F
    数值分析 发表于 2022-9-25 00:20
    3 j( D& W: u: A这个不是这么比的吧。。。# y1 ?& A) k' Z+ v
    8 ^$ M) T3 I- D1 d+ S. B+ t
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    7 R) \" k; J2 D, J2 h
    ' g" B7 s* B3 S
    有道理。
    7 e+ R4 m% @) m8 S: S所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,记得 numeric 库里有算向量内积的,我回头试试。
    7 A/ p' d. U6 M( W4 Q1 l$ U* l& K% }; N( z1 }- g  t5 `9 \$ i9 k
    我先尝试尽量用标准库,一个小程序,不想搞得太复杂。多谢了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    9#
    发表于 2022-9-25 01:27:53 | 只看该作者
    雷达 发表于 2022-9-25 00:46
    4 U* m, ^  \* O7 ]' R有道理。4 _7 S" G9 s) _/ T( M, N
    所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,这大 ...

    8 w6 X+ E" C0 ^/ V' w你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子,把循环本身翻译成机器指令loop或dec/jnz,两者速度上会差很多
    4 w6 a2 Z' r* `: b1 k7 L3 f2 jWhy is the loop instruction slow? Couldn't Intel have implemented it efficiently?
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    10#
    发表于 2022-9-25 01:48:51 | 只看该作者
    数值分析 发表于 2022-9-25 00:201 |$ s. M( n2 n1 S& R
    这个不是这么比的吧。。。; B* |. h. |+ B
    9 j( \5 c  O. ~: p& g
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    而加上内循环,光jmp和dec指令就至少多执行了6000个
    + l+ C! U6 w3 p
    * w8 Y( K) O+ M, c% W6 z
    现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果循环这样跑,花不了多少时间。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    3 小时前
  • 签到天数: 1928 天

    [LV.Master]无

    11#
    发表于 2022-9-25 02:06:44 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 02:16 编辑 1 d! B5 ?5 S4 S* i) E$ Q  b
    沉宝 发表于 2022-9-25 01:48
    ! C! {* f( c; R9 J1 N" {5 g9 }现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果 ...

    9 u  z* H5 t# t6 Y+ K# F" W
    : r$ U( B  n4 i: s) _+ x9 f2 U是的,兄台说的对。1 o+ H  ]- d- ?- H& \5 i( t& [

    / S1 p  K8 d9 e3 P' G5 x其实我想说的是 真正数值计算部分和代码中其他不直接计算的overhead的比值这个事儿。& c6 H, f2 a# H

    $ Z1 z1 ?- `$ W, G! i3 w雷达兄构造测试用例的时候,屏蔽掉了所有计算的部分,使得剩下的都是overhead,这样run time比较的结果就显得好像不合理了。如果把计算加回去,计算部分的run time会dominate,结果就不那么离谱了。因为不好说,所以用指令数对比的方式试图直观地说明这一点。
    ! h9 x1 u  s! Z$ S$ C, F8 E3 L
    & k. e5 R" I. k5 L. G+ q* [比如说,如果有计算,那么跑六千个循环相对于计算应该用不了多少时间。但是如果一边是什么都不做,另一边是六千个循环,那六千个循环比什么都不做慢几十倍了,就不是那么不合理了。1 o" |7 z0 E' y- \# X  v1 B

    $ M' x% \* M) H9 x当然也有可能像兄台说的,是优化参数的问题,但我觉得更多地是测试用例设计的不合理。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    擦汗
    2024-12-25 23:22
  • 签到天数: 1182 天

    [LV.10]大乘

    12#
     楼主| 发表于 2022-9-25 04:47:43 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 04:49 编辑 : I! X9 p: \) z6 \4 |% d9 o/ u
    沉宝 发表于 2022-9-25 01:27
    , }; X+ u' |( _你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子 ...

    9 s2 Z1 {6 e1 y- b( [1 v' L/ k7 f0 Y8 c. A3 n
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差一倍,我上面这个差的太多了。8 n2 q5 B# ?3 e  Y7 L
    : @9 F# T: T1 E
    我已经完全懵了。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    13#
    发表于 2022-9-25 05:51:23 | 只看该作者
    雷达 发表于 2022-9-25 04:47
    # l% U, a; L2 V. ^5 ?6 w! z又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...
    " l! b9 Q* Q% q  \' N  z5 t8 G9 j
    时间差一倍的结果可以接受。
    + @! |* o8 l/ p4 `% z0 C8 _3 N( {! K, [) x! u
    你还是用profile工具看看吧。现在大家都主观瞎猜。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    3 小时前
  • 签到天数: 1928 天

    [LV.Master]无

    14#
    发表于 2022-9-25 14:58:59 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 15:38 编辑 - H& D5 D4 H$ _4 o* F
    雷达 发表于 2022-9-25 04:47
    6 k7 s9 u/ u* t, V* S" Q6 h$ ^又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...

    2 G& {/ k8 [! U2 h1 o% R* z6 K$ M0 {0 t6 r& O: {2 ]
    $ ?0 E/ y) d' v$ G" f* F% b
    # h( q+ i. H4 z6 C! b8 C
    能不能把这个也贴上来,看看和上一个有什么不同?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    擦汗
    2024-12-25 23:22
  • 签到天数: 1182 天

    [LV.10]大乘

    15#
     楼主| 发表于 2022-9-26 01:30:03 | 只看该作者
    本帖最后由 雷达 于 2022-9-27 01:17 编辑
    1 j0 q) z& V# `& z4 m7 ?3 n& m
    数值分析 发表于 2022-9-25 14:58
    , c1 ]. b/ ?' n+ r* I能不能把这个也贴上来,看看和上一个有什么不同?

    1 H4 _' E8 p3 m1 p% ]理了理思路,重新做了一个测试。
    9 D8 ]; ^; f! E, ~; M: B1 ~做了两个 vector 和 两个 float *, 都长 100000" M+ w( Y2 E* M8 M( F
    外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
    - T6 n4 A" r" \2 @7 T. G" X$ H$ y8 A! R9 r" I! n: M  E/ s
    内循环试了4种方法,3 T1 z  l3 D# S5 s7 e* ?8 n: d; B3 x
    1. 直接调用 vector inner_product 247s + w% k5 _; u& _$ m
    2. vector 循环点乘累加 237s% A8 P2 k6 P( J2 s9 V# \
    3. float * 循环点乘累加 204s8 g, p# H. X; |3 s( _/ v
    4. 空循环 100000 次 202s
    7 F$ u/ m5 g" F1 A6 ?, N+ \% W
    不做内循环 200s
    0 i8 L( `) C' s+ t; @1 j. M2 f5 K$ B4 I! A. I0 `: j' q' A
    你昨天说的对,内循环本身占比是很小的,大头在其他处理。/ j$ E7 P/ y- R$ ^0 [. Q% X
    另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。% j% a8 `& v0 T) l8 G
    3 ]% ~! r) t' Q0 N0 |% k
    至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
    8 ^  S. ~0 `$ {$ f5 Q4 f4 V
    1 v! q. I! Q, m7 i; ~(为什么下面我贴的  b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成  jj 好了,原来 方括号里的 i 是斜体标志  LOL)
    ) P, H0 @4 a* M
    5 o5 m2 f1 d* j: Y3 z
            std::vector < float > vec1(N);( z, ]5 k& i, S! g+ j
            std::vector < float > vec2(N);7 K5 b6 c# q# ]% e  Z, }
            float* b1 = new float[N];
    ( O% S' V* d! P4 b        float* b2 = new float[N];
    : I  ^% E3 ~/ W. }
    & @8 _8 v  q4 }5 l8 V3 C% t        for (int j = 0; j < 6000; j++)
    % b2 i' e# d1 Z# [, s        {! P. Z. ]& ?8 f; H2 I- n0 B5 A
                    std::generate(vec1.begin(), vec1.end(), []() {
    ' ]0 M3 Y$ [% t* M. c# ?                        return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
    : p* m3 S% D, S% Z4 }1 @9 r! p7 T                        });
    7 L) A4 ^4 [( I" h  H, l6 u5 n  p. z- D( f8 |
                    std::generate(vec2.begin(), vec2.end(), []() {# L4 v* {% n# V! U0 J
                            return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
    ' N- R$ k% l  u+ M0 s( ^                        });/ |2 Q" c. `* j8 F
    " Y2 K3 I; W- I' E
                    for (size_t jj = 0; jj < vec1.size(); jj++)
    , i' g' X& k; t1 |& K                {+ ?) ^4 B# t9 R! P4 C
                            b1[jj] = vec1[jj];
    : c2 h/ K- n" ?9 S( K                }
    1 n5 A. {( q6 y/ q# P
      P  o1 V0 f2 C- w4 }+ M6 c                for (size_t jj = 0; jj < vec2.size(); jj++)
    - D. @4 i& M* e+ [3 T  Q! |; }. q                {
    , b& v3 X) n1 C; Z( }* t" V1 w                        b2[jj] = vec2[jj];
    : I9 a  s4 B) @; d" ?                }
    # }  x' u5 v8 D5 B6 g; D* p. p5 q& O+ h$ `$ c1 U3 s& t
                    //Method - 1  N=100000 247s  & f0 M' h. Y* U$ U3 O
                    //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);- B- J' B3 F1 ~  ?1 ]% V
                                    
    + W2 m: n, z5 R: z- Q; w5 g$ e                //Method - 2  N=100000  237s4 X- z' I( O, O  q. M3 y" h
                    /*3 ^0 z! u4 _( N2 c4 t  U
                    for (int jj = 0; jj < N ; jj++)
    ; ]- u3 ?7 `- i' t' c( f* j                {( u+ P! W, \/ [/ [' u. c2 l7 N1 j
                            fresult += vec1[jj] * vec2[jj];
    7 q) ]/ c5 ?3 [; P8 v                }$ T! d  t5 v& O4 g+ T
                    */
    ; O+ s9 g/ U3 M( A" q" v                                
    * o8 s; A2 D& I7 w5 J. q                //Method - 3  N=100000 204s
    / X  ~3 o% L' {' U# \0 Q                /** b9 k* m& @* O0 r( U% D3 G
                    for (int jj = 0; jj < N; jj++)
    ; Z+ d% M6 B) _& z% I3 _8 r; x( i  c                {" D$ Q  E  O1 ~" U& V0 e3 `' g
                            fresult += b1[jj] * b2[jj];) b' Y& D7 g2 V
                    }
    0 C4 y$ o: D: v8 w                */
    8 D% O: |8 K- T* s% K) K. w+ _# u& B4 q+ v4 ~1 r) {; \
                    //Method - 4   202s
    5 [5 e, K( t) ~! _, q4 _' y' D                /*/ H+ m% ]3 Y% z' D8 z# {; I+ X
                    for (int jj = 0; jj < N; jj++)4 L& {) s" Q( `1 O8 P+ V$ q% |' y
                    {
      t& H" Y% H) X: T! W* D                        
    / x( S# c/ }6 T9 t( |4 ~                }
    6 r' O9 o# I  L8 k9 K: o4 X                */
    1 N0 l5 w9 p, J% J" K) [+ s                //comment out all methods, N=100000  202s               
    * i5 f& Q4 S2 ~- o        }
    % S: O1 v2 z  h8 g/ h3 ?: x; V7 B& W# y$ k# z# o3 k
            delete []b1;/ `6 s  E. d; e7 y
            delete []b2;
    3 d2 w  z# R( [% ~4 n. F
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    16#
    发表于 2022-9-27 00:15:38 | 只看该作者
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?6 `" h- h6 {- n' O7 T0 H  ~
    5 `! [$ o8 I0 n! U9 R
    你第二个试验里面的j在循环里面又重新定义了啊,你确定真的跑了6000次?: ~& Z' F5 L4 n* S9 e. G) U$ n7 Z5 ?  p
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    擦汗
    2024-12-25 23:22
  • 签到天数: 1182 天

    [LV.10]大乘

    17#
     楼主| 发表于 2022-9-27 01:16:03 | 只看该作者
    机器猫 发表于 2022-9-27 00:15
    ( c/ H8 j, B- J* b: y: z1 ^0 z! o! L瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?( o) y- G% C7 M% X% h
    - a1 \3 C3 K3 Y2 o+ @" H/ N+ G" X  K
    你第二个试验里面的j在循环里面又重新定义 ...
    4 F" L0 M* e9 w8 e6 W* @2 ?4 r3 s
    内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL: C2 j/ r# X' f
    7 l! J- O; i; m, v5 }  P
    不和它较劲了,瞎耽误工夫,我已经转到 ubuntu, 也准备顺便试试 avx2 向量化。
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    18#
    发表于 2022-9-27 02:06:58 | 只看该作者
    雷达 发表于 2022-9-27 01:16% ~( ~* g: ~* \
    内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL
    ) \# y, h) J1 b% d( P$ t2 u$ k" U$ Z7 L' X) h1 F- t5 K
    不和它 ...
    1 k3 ^0 |  i# t7 [* j* Y+ e9 }8 H
    2 f5 e" `3 v: B
    不过可以试试我说的register变量。前一个试验j是混在一堆其它变量里一起定义的,很有可能是在stack上,这样内存读写会更多,要是再碰上每次都需要加载cache就更慢了。/ r% [+ N/ f- U  ?9 r- a
    后面一个是在循环那里定义的,说不定编译器就把它优化成register变量了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

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

    使用道具 举报

    该用户从未签到

    20#
    发表于 2022-9-27 20:29:50 | 只看该作者
    雷达 发表于 2022-9-24 23:54  Y/ [8 d: t3 N
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)4 K7 x! {' E* W* J( \/ F2 c1 u
    {
    # N. r7 K  q$ e; e$ S4 u3 _        comp temp, xtimesy;

    . ~2 R7 D. i* e; b这个code里面如果Openmp没有被注释掉的话,那么temp那个变量应该是定义在循环里面,否则线程之间会存在争夺写入那个temp的风险。8 x, }2 Q" x4 v6 n: W7 r
    内层for循环如果没有内部操作的话,编译时应该被优化掉了,和你完全注册掉整个循环是一回事。可能你的编译设置没有打开优化?
    1 L% W: [9 l9 fVS社区版没有问题,我工作用的就是社区版,设置正常的话不会比商业版差。以前游说头头用Intel Compiler,他说不想花钱,而且差不了多少,就一直用到现在。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2025-7-6 04:26 , Processed in 0.068602 second(s), 20 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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