设为首页收藏本站

爱吱声

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

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2022-9-24 22:54:26 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
    C++ 比 Octave 慢好多,怎么破?  `- f6 r* X( I! m: [
    - e2 m- \6 w- y& d: k
    自相关两层循环,内层循环涉及浮点数计算,试验了一下把内层循环内部全都 comment out 只留个壳子,  但空的内层循环本身就把速度拉下来了,看来问题并不在浮点计算。1 @1 n5 ^4 o$ e4 U6 |; Z
    : G- m3 {5 Z* l/ @# E8 L/ l% t
    速度优化问题真的很有意思啊。
    ' i9 u# W. I, c# j. I
    5 k% ~. ]6 D( V8 O欢迎大家继续讨论

    评分

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

    查看全部评分

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

    [LV.Master]无

    沙发
    发表于 2022-9-24 23:04:16 | 只看该作者
    拉下来?拉多少?; a/ X( z+ y. S7 m- [* n
    把代码贴上来看看?
    0 F8 o6 J0 M% L- n7 I4 s+ {$ K( o# m  e4 A
    难道分支预测不准破坏流水线执行?不该啊。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    板凳
    发表于 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 z3 w& U. k* b( H  i; S
    数值分析 发表于 2022-9-24 23:04
    4 m2 n. R4 t, P' V9 {拉下来?拉多少?- K% A; I& A4 \* U/ x" p8 ?7 _5 S
    把代码贴上来看看?
    . V1 ~* A# `7 a  Y

    ( f0 L1 r& N* H3 f3 n" |" ^7 Xvoid xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)4 u4 z! q* e4 C! ?6 y* J. u9 S2 _! U9 d
    {
    % ?( _0 _2 h. v3 ^        comp temp, xtimesy;6 f( S7 b4 {! g* b7 w" p! y7 K7 F
            xtimesy.re = 0;
    5 e# b8 K1 [& ^" F, N        xtimesy.im = 0;
    & c+ d% J9 \0 q  G: e, y        int j0 = lenB - 1;
    7 q# O! J3 e# W% Z  B/ \  E( f" ^        int    i, j, i1, reali;( \; p5 Z4 n3 b; }
            if (lenA % 2 == 1)
      _6 \- h: V( M9 z9 w3 c8 [                reali = lenA + 1;0 {* C7 l; {. E7 [. A. {6 l7 c9 Q* T
            else
    ! ?/ o# Q$ e0 P6 q7 m4 F                reali = lenA;/ B" O9 r/ g' j
            reali /= 2;0 ^# y% Q5 j# n+ \6 ?
    6 e  g# x$ z7 s3 H
            int nconv = reali + lenB;2 T- T; o8 J$ V' G& c9 @7 p1 M
            //#pragma omp parallel for
    & P* K7 L# ?, t( }2 f* Y: N        for (i = reali; i < nconv; i++)7 q0 U: g6 f! b
            {
    & M3 q! F8 B, G- R                temp.re = 0;
    9 Y" g8 W3 Q7 S6 B8 p! N4 C/ Q                temp.im = 0;
    , K# [; i) B7 i0 y                i1 = i;  c! P5 @, j8 B1 Q3 z+ y
                    for (j = j0; j >= 0; j--)! \7 d) @3 e: R2 M: S5 j6 Z  `
                    {  O; i: E9 [- X9 d; [+ L' ]
                            /* floating date operation */1 X8 i6 A; ^( h# R7 t+ R
                    }

    6 n. y$ I2 `$ i( a0 A. R5 o        }0 S0 H+ |3 e4 P; _: X" G' A
    }0 K  ^' \# ]  l# }& p
    ) G: D9 b' A2 P3 @; o6 f+ \9 m
    xcorr函数代码如上,comp是复数struct, 做过长度为11、19两个矢量的测试,和octave结果完全一样
    " Z# t0 E. d/ h
    ! A4 X1 ]! ?. k1 O6 J+ S% L+ s红色部分是内循环,现在其内部操作都comment out 了, j0大概是 6000。
    7 n# T. Z5 D1 [7 b8 {1 e. m现在call xcorr 100次,耗时78s.
    % V4 E$ f: H' y$ i1 X0 G
    ) L9 D/ R2 F7 n1 H) x1 s% K  [如果把红色部分内循环本身完全comment out, call xcorr 1000次,耗时 <1s.
    ; y* v+ @4 y9 w$ j6 r) l# q; d7 w( k, `- s) [  l- {9 K4 ]* X
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    6#
     楼主| 发表于 2022-9-25 00:17:17 | 只看该作者
    风雨无阻 发表于 2022-9-24 23:33' D3 ]1 Q0 L2 p4 G. n) n
    Maybe Debug mode?
    9 X7 P& [9 J" k# f' z5 Z

    ) r. Q( v; d4 N' ]- Q* ^不应该,看我上面的回复。
    0 s" Z8 ^6 z( n: C+ k' h, d3 e/ u6 D7 X+ m& k
    我更怀疑是 VS 社区版的问题
    回复 支持 反对

    使用道具 举报

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

    [LV.Master]无

    7#
    发表于 2022-9-25 00:20:10 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 00:24 编辑 & R' T6 K3 a! |2 n+ q2 ^
    雷达 发表于 2022-9-24 23:54
    5 Q8 T9 g5 q- ~! D) S6 d# s. Ovoid xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    4 x' L& m- p0 L{
    * J6 H  u, |6 m        comp temp, xtimesy;
    - T. g; u! o4 o& t1 O( x

    - O/ ]: M) V7 r这个不是这么比的吧。。。3 a9 }" O; u9 @. t+ Z: Z( Q
    3 z7 q& a7 p- D6 v% w
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。: X6 n9 R5 z- j( f; g; `; g3 B
    / p- @0 f: B: U0 s& J
    而加上内循环,光jmp和dec指令就至少多执行了6000个,慢个几十倍不是正常的么?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    8#
     楼主| 发表于 2022-9-25 00:46:56 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 01:09 编辑
    ' T- y: D  N. P
    数值分析 发表于 2022-9-25 00:20
    0 ?8 J3 b0 X% J6 G这个不是这么比的吧。。。! U- f; M2 u3 N7 A. \
    + \7 I# Q6 z& ^4 F1 D9 ~6 y
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    , I6 c" H6 C6 W- [+ r  |/ q

    8 `$ H) i/ Q/ I3 l% Z  p有道理。' a& p. c7 j% z% [" i4 n6 l% r6 J4 r
    所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,记得 numeric 库里有算向量内积的,我回头试试。
    : y( _4 H2 W2 |0 J) y1 q
    9 F4 x! v0 q% p' f% Z我先尝试尽量用标准库,一个小程序,不想搞得太复杂。多谢了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    9#
    发表于 2022-9-25 01:27:53 | 只看该作者
    雷达 发表于 2022-9-25 00:467 `# Q: R9 a# d
    有道理。
    8 D; ]! d# \) c所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,这大 ...

    & F; A8 F3 n0 b& G7 s+ \2 F1 O你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子,把循环本身翻译成机器指令loop或dec/jnz,两者速度上会差很多! D( s: A+ w- f  `/ m& ]
    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
    & ^* \: k+ ?! r8 B这个不是这么比的吧。。。
    ) \& K8 y) Y1 C
    $ D$ s3 ~. I$ ^5 H  {您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    而加上内循环,光jmp和dec指令就至少多执行了6000个

    , W& c2 Q3 @9 V  v5 a# c& j2 D
    : f/ F' m* y5 w- W. Y; f现在的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 编辑
    + X( J! Z) A. W$ _0 K; ?
    沉宝 发表于 2022-9-25 01:482 @" }& z8 r$ G$ N0 n. b
    现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果 ...
    & i% v% J# A' }- }, s
    " K. K! ^" `" A; g( _' o
    是的,兄台说的对。) |  Q8 \& `8 @9 D% {& i

      |% d& G% r/ E, q1 w  O其实我想说的是 真正数值计算部分和代码中其他不直接计算的overhead的比值这个事儿。
    ( v' d% l9 g3 |8 R6 P. u& [2 X, L7 W# I9 s$ i
    雷达兄构造测试用例的时候,屏蔽掉了所有计算的部分,使得剩下的都是overhead,这样run time比较的结果就显得好像不合理了。如果把计算加回去,计算部分的run time会dominate,结果就不那么离谱了。因为不好说,所以用指令数对比的方式试图直观地说明这一点。
    - g3 h  ]7 d, ?  ^0 r) v9 O( y0 r( p5 N8 e. e- w* K. T
    比如说,如果有计算,那么跑六千个循环相对于计算应该用不了多少时间。但是如果一边是什么都不做,另一边是六千个循环,那六千个循环比什么都不做慢几十倍了,就不是那么不合理了。1 v5 O8 P  x% J- Z! F+ a

    * R8 s/ D# {5 ~当然也有可能像兄台说的,是优化参数的问题,但我觉得更多地是测试用例设计的不合理。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    12#
     楼主| 发表于 2022-9-25 04:47:43 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 04:49 编辑 8 n' f+ f/ D% H: l2 S+ n1 s
    沉宝 发表于 2022-9-25 01:273 h* `0 U$ x  S3 Q3 _) E
    你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子 ...
    ( K' c3 _" Q/ a0 I

    $ H/ V) n8 b7 s' K* ^$ ^又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差一倍,我上面这个差的太多了。# |7 t* C: U4 S; p! e, L/ S
    - A  x  r& U/ n9 J5 `9 z. A& T
    我已经完全懵了。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    13#
    发表于 2022-9-25 05:51:23 | 只看该作者
    雷达 发表于 2022-9-25 04:47  b! b) D1 F! S1 j% J7 e( e! L  h
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...
    3 j* R8 j. h, S) e" }" H7 E
    时间差一倍的结果可以接受。
    : x. R  V0 p' k$ k0 x- B
    ; N' V& |* j# C  a3 ?9 l你还是用profile工具看看吧。现在大家都主观瞎猜。
    回复 支持 反对

    使用道具 举报

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

    [LV.Master]无

    14#
    发表于 2022-9-25 14:58:59 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 15:38 编辑
    - |5 q. f, `0 {, F
    雷达 发表于 2022-9-25 04:47  ~' k0 V; ~0 \5 c6 Q
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...

    4 a9 Y2 f8 }& u8 ~. H* i1 L8 x5 |2 P7 _1 \4 L! m# i

    # Y: ~7 I5 d2 s( r
    6 s  ~- K  {0 v/ L  ^% W1 M能不能把这个也贴上来,看看和上一个有什么不同?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    15#
     楼主| 发表于 2022-9-26 01:30:03 | 只看该作者
    本帖最后由 雷达 于 2022-9-27 01:17 编辑
    / |; ]' U: C$ J1 a7 Z7 J1 b! |5 t# U
    数值分析 发表于 2022-9-25 14:58
    ' D& N- e7 i  \( [- ~' _能不能把这个也贴上来,看看和上一个有什么不同?

    ) V3 p2 J6 ?* K理了理思路,重新做了一个测试。4 D+ \' I: [: W$ \4 E
    做了两个 vector 和 两个 float *, 都长 100000, i& T3 r) @6 C3 b' X$ I4 a5 }
    外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.2 E4 Y6 E% U+ e
    ; L* R! R: g2 m( N
    内循环试了4种方法,6 j8 q9 k! [4 L+ _# X# @& m
    1. 直接调用 vector inner_product 247s
    9 m( Z  R6 I; D& {' I3 T; Z2. vector 循环点乘累加 237s3 R1 r$ |" |1 l# o/ i# K3 d
    3. float * 循环点乘累加 204s1 S2 N( T6 G* J0 [. p' T
    4. 空循环 100000 次 202s
    - R4 `  j$ i7 s3 M- F$ f5 E# f; D( i, b! g7 k# U
    不做内循环 200s0 d( Q5 |3 X1 @* p% x

    % f6 h+ O$ ~' R你昨天说的对,内循环本身占比是很小的,大头在其他处理。- h- e) J+ h" z% S, y, G
    另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。3 T- w; b$ p0 _* T, y
    8 A5 @* ^- _% d7 K
    至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
    4 J0 ]9 H/ V  s# Z! {3 y/ m2 Z
    , \  q; J( ~* g3 Y(为什么下面我贴的  b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成  jj 好了,原来 方括号里的 i 是斜体标志  LOL)2 f/ `5 R5 Z" `; M/ F

    3 T8 H  R* r" h# l; ^4 B7 v7 a
            std::vector < float > vec1(N);
    ; p& b6 ^: i1 c2 g        std::vector < float > vec2(N);
    / t; U: h8 m6 X( F- ~        float* b1 = new float[N];
    ) ?, e- i" `& N1 R" N0 F* q9 R9 Z8 [        float* b2 = new float[N];
    ; i: N0 n% H6 p* ]$ m4 v; S( y, b8 K6 m$ y0 M2 g; B5 p2 z
            for (int j = 0; j < 6000; j++)6 p7 r$ g/ l! `6 ^
            {$ D0 n, i/ q( Q3 b0 z
                    std::generate(vec1.begin(), vec1.end(), []() {' S* o3 @( S$ n; p
                            return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
    ; l% F" d. ^1 t. y                        });
    : y* B3 P% C9 V" s& p$ u' d! B  ^6 G. |  W5 D" `$ O" d
                    std::generate(vec2.begin(), vec2.end(), []() {
    6 ?+ Y. y1 I; }% n$ @! q                        return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
    / B3 z) B2 r+ I                        });
    * }) A5 b  [" c' ~, Y* C0 k8 y
    # i& E0 M3 }, m8 A( e                for (size_t jj = 0; jj < vec1.size(); jj++)
      Y* e* J' C7 a: t) K) ], K" Q                {
    ; b; q0 r- W4 ~/ o1 _* H                        b1[jj] = vec1[jj];1 [$ H" Q: O+ t; _5 R
                    }0 ]2 ~0 {( D( y) ~3 J

    ! I. Q5 T# ]  ^9 O" \- l                for (size_t jj = 0; jj < vec2.size(); jj++)8 w9 E7 ~. m& N1 _4 G
                    {
    5 E5 z- G' w- [3 Y' p: A. ?                        b2[jj] = vec2[jj];
    $ b4 Z" P# P" e1 A+ D) @                }
    * a; k. ^6 J6 D9 C; ?% C% J  i1 ]( D  c! u, p4 p- z4 W
                    //Method - 1  N=100000 247s  4 t* V$ [$ S# y. u( v* ?  ?
                    //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
    : H& t2 N  _5 t/ I, G# @1 B% n                                
    6 a) r8 h3 l3 {3 m1 c" Q                //Method - 2  N=100000  237s  z7 o  d- _1 W# _
                    /*
    ; y* B! W; B, L4 t* j0 a                for (int jj = 0; jj < N ; jj++)
    7 B! u7 b! H+ q+ y* t3 \& h                {
    , C8 O  g. ~3 e0 e( @* i- o3 T  M1 {                        fresult += vec1[jj] * vec2[jj];( }* o8 y& b/ D
                    }8 b0 [) i  W6 o: Y3 `" m
                    */! X. s) E, S0 {) g
                                    $ e! a# p% G7 [9 Z$ e$ a
                    //Method - 3  N=100000 204s( z, g6 K! f, ]/ Y2 Y
                    /*
    " ~3 U7 Q" F, b8 r0 S                for (int jj = 0; jj < N; jj++)
    2 U, y1 z/ [! i                {& W  d9 s, A: }8 C3 ]+ w! B
                            fresult += b1[jj] * b2[jj];- f4 G; z* r, L- \
                    }
    # F! z1 ]7 B) W% V                */8 l3 m# P0 O) h; n: y' F: t: Z

    # |1 s6 S  |6 d) |7 Q                //Method - 4   202s
    3 ~9 X6 H0 _, O8 R- Z- X  b                /*. e5 R3 r' Y% {2 d8 V; Y0 Y' I
                    for (int jj = 0; jj < N; jj++)
    3 E7 O' H) Z$ `7 [                {$ ^8 \" I$ m3 d. u9 C! t1 O8 {5 D
                            " n  e# E4 T4 K- U1 e
                    }
    ( M, H, i4 s9 w7 |2 L& H' x1 Y- K                */
    4 Y% V8 J# l9 E' }% H                //comment out all methods, N=100000  202s                ( X: D5 e- \) L
            }
    ) N/ @$ N% a" ?. [; d( b5 r! w3 o4 D  m# T) z4 |* t
            delete []b1;
    % A- q2 F( ]! v& g% F7 w0 D" u; D7 T        delete []b2;

    * o' J7 r* C" S- }3 S
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    16#
    发表于 2022-9-27 00:15:38 | 只看该作者
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?
    3 T% T$ I- t$ q! O$ F7 A( ~' W5 H% @9 Q1 m
    你第二个试验里面的j在循环里面又重新定义了啊,你确定真的跑了6000次?5 B5 C. Z9 V1 w5 k* L2 O; \8 f+ O
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    17#
     楼主| 发表于 2022-9-27 01:16:03 | 只看该作者
    机器猫 发表于 2022-9-27 00:15
    ; F; ?# a, N4 F' T1 p" R( L瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?
    * E# f3 _; ^/ e" ^  [; ]
    ( t5 Z: d% e8 K/ a, K' X你第二个试验里面的j在循环里面又重新定义 ...
    : [0 h: {1 ?' w4 v$ E
    内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL: i6 G  S& }5 S" N: S

    ) c- d9 P+ n8 r4 \& c$ w( P不和它较劲了,瞎耽误工夫,我已经转到 ubuntu, 也准备顺便试试 avx2 向量化。
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    18#
    发表于 2022-9-27 02:06:58 | 只看该作者
    雷达 发表于 2022-9-27 01:169 \5 ^. v' ~( a( ]2 ~
    内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL% J4 S3 B# \; m/ m& M

    $ q3 {1 d$ z3 i# d不和它 ...

    # u- ?1 {1 d8 |6 p$ Z# Q8 D* e- j- q* j- s' X
    不过可以试试我说的register变量。前一个试验j是混在一堆其它变量里一起定义的,很有可能是在stack上,这样内存读写会更多,要是再碰上每次都需要加载cache就更慢了。4 w" N9 F! Y- t" }, y( h) @
    后面一个是在循环那里定义的,说不定编译器就把它优化成register变量了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

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

    使用道具 举报

    该用户从未签到

    20#
    发表于 2022-9-27 20:29:50 | 只看该作者
    雷达 发表于 2022-9-24 23:549 a$ e4 k" }3 Q2 Q& U
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    7 I- T6 a- I  o; P$ m6 e{# G* X$ V) R9 a6 i6 [7 W
            comp temp, xtimesy;

    ( H7 m. ?8 m6 \6 e: ~+ F- \$ w; w这个code里面如果Openmp没有被注释掉的话,那么temp那个变量应该是定义在循环里面,否则线程之间会存在争夺写入那个temp的风险。  L+ _* V" |9 m8 s4 d+ |
    内层for循环如果没有内部操作的话,编译时应该被优化掉了,和你完全注册掉整个循环是一回事。可能你的编译设置没有打开优化?
    / m  w% v/ A' v+ [7 c, d9 TVS社区版没有问题,我工作用的就是社区版,设置正常的话不会比商业版差。以前游说头头用Intel Compiler,他说不想花钱,而且差不了多少,就一直用到现在。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2026-8-27 05:21 , Processed in 0.077527 second(s), 19 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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