设为首页收藏本站

爱吱声

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

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2022-9-24 22:54:26 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
    C++ 比 Octave 慢好多,怎么破?
    % @9 |  z/ h% `4 ^$ ?* D" b7 T& S
    + D/ |, z/ j  O4 o1 h. [* K自相关两层循环,内层循环涉及浮点数计算,试验了一下把内层循环内部全都 comment out 只留个壳子,  但空的内层循环本身就把速度拉下来了,看来问题并不在浮点计算。
    & b2 \: s# V' o8 C5 J# f+ ?: g5 Z3 S) ~
    速度优化问题真的很有意思啊。1 r* x* ?4 R1 ~/ t# q! K8 @
    $ z. H/ a2 b7 C' G1 B6 q
    欢迎大家继续讨论

    评分

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

    查看全部评分

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

    [LV.Master]无

    沙发
    发表于 2022-9-24 23:04:16 | 只看该作者
    拉下来?拉多少?
    ; \  P# S  ^$ B$ V- v1 ~  v! {2 T把代码贴上来看看?5 Q* E) I# O) v9 o! J+ X% k) x

    2 _% c: j4 S. ?6 r/ O# K0 f2 W" P难道分支预测不准破坏流水线执行?不该啊。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

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

    使用道具 举报

  • TA的每日心情
    开心
    昨天 02:53
  • 签到天数: 125 天

    [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 编辑
    1 M& u( @2 l: M2 t# a5 q
    数值分析 发表于 2022-9-24 23:04
    ' S5 [9 [5 m$ R( Q拉下来?拉多少?: X, U0 c8 F9 S3 b( f' J( b. o1 b
    把代码贴上来看看?
    0 j; z8 C. Q2 s

    2 D9 d) q8 d: u0 B5 Xvoid xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    0 Z# b0 Q) S0 S0 B1 z. k& E{- ~* K: l/ x" I8 [8 }' J
            comp temp, xtimesy;
      y8 X$ r  h# O4 m% C        xtimesy.re = 0;* Q3 X& U1 J! u0 i5 {- I
            xtimesy.im = 0;
    & _& j' ]) Y2 l( h: Y) Y. y        int j0 = lenB - 1;' m3 U! s1 \: B3 ~4 P% O/ K/ N
            int    i, j, i1, reali;
      k2 T7 c2 _( \! x& w% a3 L% n        if (lenA % 2 == 1)
    5 F! C4 m2 C/ d% q  o% g                reali = lenA + 1;; }" ^6 B* z9 [% T( L  K# X: u
            else6 @4 S8 W. @7 [' |1 |
                    reali = lenA;
    * q7 p3 Y& i6 m% c9 s0 P/ j        reali /= 2;7 e' z7 z# x, H1 v4 o3 v

    7 `$ J4 g. A! f        int nconv = reali + lenB;
    + u, a* h+ ?! |* F' V  Y- A/ v9 O( d! b        //#pragma omp parallel for0 p3 w# V: L+ Z7 }- M7 [
            for (i = reali; i < nconv; i++)
    , P3 J0 k8 k& k0 e3 H        {( I/ f+ z* b1 ~% Y5 z# }( w
                    temp.re = 0;
    0 |8 a4 o' x7 p8 S5 f                temp.im = 0;
    7 K- C% k5 d$ H) F                i1 = i;3 F, {% M4 a% l7 I2 o3 r
                    for (j = j0; j >= 0; j--)
    $ {1 M. \5 K- k: N% J0 ?/ G                {
    6 T. o4 E9 T+ D6 X3 `                        /* floating date operation */  ^0 q8 z1 }3 P+ F$ q
                    }

    ( a9 B0 R$ G) Z6 I1 [        }
    7 A3 K( n- F+ s, l}5 @6 }8 C% r& P) L  T+ u, q7 @

    5 m, P) E' V' Y$ f  _xcorr函数代码如上,comp是复数struct, 做过长度为11、19两个矢量的测试,和octave结果完全一样
    8 T- O# z: @8 s0 T# X, C$ m8 \. d1 M3 Z/ ]! U- _* ^, r( K
    红色部分是内循环,现在其内部操作都comment out 了, j0大概是 6000。
    $ o3 M  q& }; T& r8 k8 {, m& E现在call xcorr 100次,耗时78s.
    ( D* v" G. r& A
    8 O9 h0 O; E, F' a1 O如果把红色部分内循环本身完全comment out, call xcorr 1000次,耗时 <1s. ! z, P: z1 F6 y
    ' \3 @$ e& [  U! G6 y- S
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    6#
     楼主| 发表于 2022-9-25 00:17:17 | 只看该作者
    风雨无阻 发表于 2022-9-24 23:33
    ; @: x3 B2 |) GMaybe Debug mode?

      I1 l* R/ W( [5 o
    0 C$ n  D9 Y# M, o; @* R* L不应该,看我上面的回复。
    2 c" F+ x5 e4 e
    # L9 b  r6 r7 m  y5 B我更怀疑是 VS 社区版的问题
    回复 支持 反对

    使用道具 举报

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

    [LV.Master]无

    7#
    发表于 2022-9-25 00:20:10 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 00:24 编辑
    ) T) s0 u6 x' f, ?" \4 v2 b7 c
    雷达 发表于 2022-9-24 23:54
    8 U+ g# B9 j6 y3 q) r7 Lvoid xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)' ^, A% ~9 Q! |
    {. {5 M0 E: k1 A% b( o3 i
            comp temp, xtimesy;
    / S; e" G9 X& T8 k& [' O8 b) |9 |

    ' n1 x6 W9 o! }2 s# `; @这个不是这么比的吧。。。  @$ H  U9 i% G+ A% O0 E7 `
    9 b. c' z0 W# P4 D
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    5 ~* A* A9 g/ C9 D% f9 G( p4 r7 K
    ! L" G, @) M& m" n; F1 Z而加上内循环,光jmp和dec指令就至少多执行了6000个,慢个几十倍不是正常的么?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    8#
     楼主| 发表于 2022-9-25 00:46:56 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 01:09 编辑 9 P$ Y9 M) i. e. M" \6 B" y& j: @
    数值分析 发表于 2022-9-25 00:20
    , p1 m4 u7 F1 w( u& g' S8 f: d7 S这个不是这么比的吧。。。# |  S9 Q8 Z* u. P3 |

    / I4 K0 m) R. C& s您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    0 p) F2 d8 R6 S) U+ e  e( q2 E4 ^! ~

    7 t) b( G4 [3 R2 {* q  s1 v有道理。' E! @* ^1 q' T2 `, p
    所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,记得 numeric 库里有算向量内积的,我回头试试。! h* ~) b8 b- J" I( ]6 E
    8 m4 e" Y* h7 x, G
    我先尝试尽量用标准库,一个小程序,不想搞得太复杂。多谢了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    9#
    发表于 2022-9-25 01:27:53 | 只看该作者
    雷达 发表于 2022-9-25 00:46
    " S) \* s- a% o- E有道理。
    6 O1 Y% E8 U( |9 z5 K2 ?/ x所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,这大 ...

    % R( D$ ^" ^+ O4 F" H: X你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子,把循环本身翻译成机器指令loop或dec/jnz,两者速度上会差很多" e' T( _7 W0 \, y1 F
    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
    8 a1 G0 ~+ Q- u" k. L3 c这个不是这么比的吧。。。
    ; V9 N# G) V% j' ~) Y* T1 K  A, z' W
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    而加上内循环,光jmp和dec指令就至少多执行了6000个

    ) g8 F0 p0 `! f& s1 z: v4 T
    0 V5 j& W. @' B2 a" c3 j现在的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 ^/ Y7 R2 H9 o! U0 u8 t
    沉宝 发表于 2022-9-25 01:48+ J. }, C/ Z. T
    现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果 ...

    # o- J) z5 X' G5 |7 O6 v
    0 y! T8 y, P" X& u4 Q% K# ?是的,兄台说的对。* m) B3 c6 M1 `4 Y

    ) V  Z5 P/ K# \/ }/ p. x- v1 U7 D其实我想说的是 真正数值计算部分和代码中其他不直接计算的overhead的比值这个事儿。# ~+ B# ^) Q3 I$ x  g: Z' U8 y
    " u$ e& K9 o7 Z9 [' K* U4 a
    雷达兄构造测试用例的时候,屏蔽掉了所有计算的部分,使得剩下的都是overhead,这样run time比较的结果就显得好像不合理了。如果把计算加回去,计算部分的run time会dominate,结果就不那么离谱了。因为不好说,所以用指令数对比的方式试图直观地说明这一点。
    / n, g! A. `! e- p& J3 D& b9 ?$ t: t4 g, u# [: h! e5 Y7 K
    比如说,如果有计算,那么跑六千个循环相对于计算应该用不了多少时间。但是如果一边是什么都不做,另一边是六千个循环,那六千个循环比什么都不做慢几十倍了,就不是那么不合理了。
      R& [# h' Z0 H' g( {; A: M2 _
    0 L) D# \0 c. @5 K) v当然也有可能像兄台说的,是优化参数的问题,但我觉得更多地是测试用例设计的不合理。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    12#
     楼主| 发表于 2022-9-25 04:47:43 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 04:49 编辑 + d4 ~9 I9 Z1 y9 b% ?" h9 \
    沉宝 发表于 2022-9-25 01:27. {: ?9 K6 W0 b4 L3 m
    你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子 ...
    * P/ X0 u- I4 `8 E( F% r
    * m! F7 P9 R9 e, T% x) Z
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差一倍,我上面这个差的太多了。1 Z9 U' [' @. S+ L

    1 x; b6 ~% S# }$ x我已经完全懵了。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    13#
    发表于 2022-9-25 05:51:23 | 只看该作者
    雷达 发表于 2022-9-25 04:477 E' H8 ^6 ^7 g/ P& |
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...
    / x; z' c! X9 T1 r
    时间差一倍的结果可以接受。
    ' E6 \0 M2 T" {6 Z  |% o; x- t8 s% m: `! A5 a
    你还是用profile工具看看吧。现在大家都主观瞎猜。
    回复 支持 反对

    使用道具 举报

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

    [LV.Master]无

    14#
    发表于 2022-9-25 14:58:59 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 15:38 编辑
    7 l0 f8 C0 G' g7 Q
    雷达 发表于 2022-9-25 04:47+ M' V0 L. U1 t- n
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...

    5 c4 _/ }2 ~- n. P& j' Q/ j$ E  ^# h$ k. q$ Y0 u2 G0 l
    . u1 m! n' e; X3 V( u8 @
    " g, @- Y2 N4 W+ Q
    能不能把这个也贴上来,看看和上一个有什么不同?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    15#
     楼主| 发表于 2022-9-26 01:30:03 | 只看该作者
    本帖最后由 雷达 于 2022-9-27 01:17 编辑 5 [2 p( g- Z9 c( r
    数值分析 发表于 2022-9-25 14:58
    * Q( ~- X) u. b/ E% t9 Z$ b5 E能不能把这个也贴上来,看看和上一个有什么不同?

    . r- R+ q% z( `5 ]/ |  [理了理思路,重新做了一个测试。
    / O' D( m" a+ k, J. _& a9 q# v做了两个 vector 和 两个 float *, 都长 100000# X9 f7 [8 W) G% U0 K7 R
    外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.% d2 ]& B9 ~1 H6 B
    ) h: f" k2 r) T1 ^0 e$ [- ~
    内循环试了4种方法,! o( ~6 i; `/ T7 ^
    1. 直接调用 vector inner_product 247s
      }8 M$ y; g% x5 ~1 j2. vector 循环点乘累加 237s
      }! \! |& L; a% j- g0 q" Z; g3. float * 循环点乘累加 204s2 F% Q0 w- b( W. V* e
    4. 空循环 100000 次 202s
    : f3 M5 w3 X. V( R. }) S5 L0 C
    ; L8 h/ z, M! u4 F7 K; P不做内循环 200s9 k3 \! b, G! ?8 z
    " @6 h, O. ?6 w3 y! A5 }2 T; P( n5 S4 @( Q
    你昨天说的对,内循环本身占比是很小的,大头在其他处理。% ~1 J* }+ Z7 F3 {- n/ J1 G7 L: S' ]
    另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。  J7 E" o4 Z2 N4 s: N6 R

    0 d) u, g% P- g$ M. S; w1 a至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)( x: w; @+ e" I" p

    2 Z! ?1 s8 L( b7 M7 f3 ](为什么下面我贴的  b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成  jj 好了,原来 方括号里的 i 是斜体标志  LOL)8 W; m+ j9 f. J; i2 a! g
    # O; j  L6 |8 a3 d3 a5 B4 _& L
            std::vector < float > vec1(N);
    8 k5 ?" \/ {! u# u9 A% H7 v& Q" z        std::vector < float > vec2(N);
    * |# }1 i1 `; o, L' {: ?& d        float* b1 = new float[N];* z; E; @9 t" R
            float* b2 = new float[N];
    ) P  R7 V- c( L
    $ y, j. N7 m. T4 }        for (int j = 0; j < 6000; j++)
    * U! V- Q- l. v8 S& E7 f        {: A3 F+ I5 F' l- ?% ~! l
                    std::generate(vec1.begin(), vec1.end(), []() {
    1 f) ?# r9 R1 }; V3 e( K; u. x6 E* ]3 e                        return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;& a- P7 d; ~1 m
                            });
    " q$ ?3 \8 o3 _) Z2 E! _& B7 g1 a& j+ c: O
                    std::generate(vec2.begin(), vec2.end(), []() {
    ! g& D: y5 ^) d, g8 ?                        return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;7 Z9 \4 c& u, B
                            });
    2 E! f* v' X' _$ J$ u  F( L1 n) W: z9 t% |# D4 Q7 @% [  }, J' C2 O
                    for (size_t jj = 0; jj < vec1.size(); jj++)0 q9 h7 K6 a" m8 S6 v* I
                    {9 v4 c& O% ^. w9 ]( h
                            b1[jj] = vec1[jj];
    + Y+ C: r' w9 k1 N( l                }
    ; Z! O# C' f9 B) B; {4 w8 Z5 t  A/ v" d$ T# z; R; R& W
                    for (size_t jj = 0; jj < vec2.size(); jj++)
    . P0 q4 p, O" k5 y% O, i                {
    - \0 H3 v, V* i0 v% a# a% a1 U                        b2[jj] = vec2[jj];# H0 D* [$ I- G/ r0 o
                    }
    5 b8 Z# u8 r) _# m$ X6 u, w8 K( T3 i
                    //Method - 1  N=100000 247s  $ f/ S6 I& b/ s* p% @
                    //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
    7 P( [6 \  h% B# d4 F+ S" S                                6 m0 o; z5 Y& N0 w+ p' j  E+ `" Z
                    //Method - 2  N=100000  237s
    1 U2 U( z* S- k. f                /*
    & X% M* J0 W- Y/ s7 P. {/ h0 V                for (int jj = 0; jj < N ; jj++)$ L/ D% a6 i) v- k9 S
                    {- u$ T" w4 h* K; x. K3 {
                            fresult += vec1[jj] * vec2[jj];
    ! I: X7 T) m4 a5 X) y3 e                }
    : K9 c+ `% Q' F6 S! a! p! O6 S, [                */
    2 j3 h# l/ p3 a5 S8 a5 Q                                
    3 |" H+ U" d4 n; ~                //Method - 3  N=100000 204s
    / a7 {/ f9 O; l8 }                /*: v3 \, H3 j; v; M
                    for (int jj = 0; jj < N; jj++)
      Q5 A5 h4 R) Q6 `- e) |! \/ S                {
    0 \- T" x, K1 z$ m7 V; e                        fresult += b1[jj] * b2[jj];! S" J- h3 O+ T$ O' v
                    }
    . f: X" n4 g2 I" }+ Z                */- j, ?4 s7 f  Y" N, l  S
    + L! k' n5 |3 o) V
                    //Method - 4   202s
    0 V8 N4 y# V7 X, t! \2 P, g2 N                /*% o; I2 ]. O/ N" m7 z% L! M% c
                    for (int jj = 0; jj < N; jj++)
    ) d/ ?3 P6 T, Y' M' G& t                {4 m3 i- l; ?1 e' r( @
                            
    - x! C9 D0 I8 a+ }$ R6 n% J' S+ i                }6 T) c' k! H" ?' p  M
                    */% z: H2 `5 o1 c) b: ~
                    //comment out all methods, N=100000  202s               
    : D$ c' ]; c6 n! g9 a        }
    + E# x4 A; T9 I! U
    4 I- d0 |" O, }6 E  n        delete []b1;/ r( O& e, |5 w" }0 }' H
            delete []b2;

    ( |$ ?7 l/ M- u# K; j% P
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    16#
    发表于 2022-9-27 00:15:38 | 只看该作者
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?7 s3 e2 O  w9 M5 f
    ) u/ G0 w: t- C) G' s8 ^* n3 r! b
    你第二个试验里面的j在循环里面又重新定义了啊,你确定真的跑了6000次?1 z$ `. |: \( @& U; B
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    17#
     楼主| 发表于 2022-9-27 01:16:03 | 只看该作者
    机器猫 发表于 2022-9-27 00:15  Q! l( Z- b7 p
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?! U# @. V- `8 X# t  h

    0 t8 u% J" P6 @" L# I" K; l( U你第二个试验里面的j在循环里面又重新定义 ...

    4 }0 e5 x6 P! j/ S内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL
    6 X% ]; _: F3 r" G
    ) h$ K+ _% {9 t. B6 `% ]不和它较劲了,瞎耽误工夫,我已经转到 ubuntu, 也准备顺便试试 avx2 向量化。
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    18#
    发表于 2022-9-27 02:06:58 | 只看该作者
    雷达 发表于 2022-9-27 01:16
    ! ]$ D# T! k$ v. @7 n. F内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL0 l  U% l+ ?0 h3 m% m3 ]1 ^
    ( [- ?8 Z( k1 ~1 V- ^9 O
    不和它 ...
    " k  q1 [& E/ x7 F0 a9 {& C
    ; `  l. R* S& W1 v$ H# P, B& y
    不过可以试试我说的register变量。前一个试验j是混在一堆其它变量里一起定义的,很有可能是在stack上,这样内存读写会更多,要是再碰上每次都需要加载cache就更慢了。" O) m. A* g+ ^
    后面一个是在循环那里定义的,说不定编译器就把它优化成register变量了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

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

    使用道具 举报

    该用户从未签到

    20#
    发表于 2022-9-27 20:29:50 | 只看该作者
    雷达 发表于 2022-9-24 23:54, X( u; y5 s8 C# h. [3 e1 G
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)/ ~. m6 k( a; P# b- F
    {1 \7 `: r2 [0 b5 `$ Z
            comp temp, xtimesy;

    . h" ?' q, r+ x这个code里面如果Openmp没有被注释掉的话,那么temp那个变量应该是定义在循环里面,否则线程之间会存在争夺写入那个temp的风险。# F% B9 P, _2 H# T% S( P" y, b
    内层for循环如果没有内部操作的话,编译时应该被优化掉了,和你完全注册掉整个循环是一回事。可能你的编译设置没有打开优化?
    , v  e; ?: n" YVS社区版没有问题,我工作用的就是社区版,设置正常的话不会比商业版差。以前游说头头用Intel Compiler,他说不想花钱,而且差不了多少,就一直用到现在。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2026-2-20 10:33 , Processed in 0.078572 second(s), 22 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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