设为首页收藏本站

爱吱声

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

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2022-9-24 22:54:26 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
    C++ 比 Octave 慢好多,怎么破?! V* f6 U! U6 a' w
    7 u' U1 n* N4 q0 t7 X* X" f" k
    自相关两层循环,内层循环涉及浮点数计算,试验了一下把内层循环内部全都 comment out 只留个壳子,  但空的内层循环本身就把速度拉下来了,看来问题并不在浮点计算。
    . l, E/ F9 |# t0 `8 \+ Y1 N) W) `2 w! S3 P2 y& w7 P$ b6 x
    速度优化问题真的很有意思啊。) D. e% p. z! |% B$ y4 c

    6 g( {- G& A8 h$ p6 N欢迎大家继续讨论

    评分

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

    查看全部评分

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

    [LV.Master]无

    沙发
    发表于 2022-9-24 23:04:16 | 只看该作者
    拉下来?拉多少?
    + s3 X2 j+ E* @8 s2 G% n, V5 m把代码贴上来看看?7 S8 o, A$ ~% C1 s$ i0 n: j/ ~6 s

    9 w  m9 S; |/ A& q难道分支预测不准破坏流水线执行?不该啊。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    板凳
    发表于 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 编辑
    ' [& G8 T- X4 |, c9 J7 ~
    数值分析 发表于 2022-9-24 23:047 U. W* @5 a% N
    拉下来?拉多少?+ e/ D- j( F3 T& |- _
    把代码贴上来看看?

    ! g8 `8 H: m5 p( J0 R
    0 ~; N8 O0 m* n- x' hvoid xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    $ ~& \3 _4 l% K, T{) f5 T( H7 ?  H& Z. `
            comp temp, xtimesy;
    . a  L6 ~) t0 k/ z        xtimesy.re = 0;8 L8 A( S1 H, ^; x4 a- t
            xtimesy.im = 0;+ w( N% m) D5 F! [. x6 ?
            int j0 = lenB - 1;* k0 s6 c* x4 {3 a% E# d/ a6 ?3 n
            int    i, j, i1, reali;% z. q6 G8 ]) m  m: t% ?4 J( L
            if (lenA % 2 == 1)' r  z) D, G* Q6 @* z* u
                    reali = lenA + 1;
    & U: p: V. H2 Q: _% B3 a        else
    ; U0 ]' q# ]1 I- F0 b                reali = lenA;
    - ]. E0 L3 B  K; U& P  z6 N        reali /= 2;" T' f3 t: t9 e3 k

    5 r* h! C* @9 i0 `/ L* e+ S  o        int nconv = reali + lenB;
    . y1 B, v* O6 r        //#pragma omp parallel for
    - {, d3 x# C( j+ _: ?! T4 `2 H+ I9 V" M        for (i = reali; i < nconv; i++); Z/ X/ ~! Q% h3 G# s# b
            {* `4 ^0 X9 L0 P3 S4 M" }7 \
                    temp.re = 0;; ?8 ^0 s$ N1 z
                    temp.im = 0;  A" Z. y$ K" _% u1 X# E9 F* e
                    i1 = i;0 v0 c" |7 ~# L
                    for (j = j0; j >= 0; j--)# j. o. }0 i% J/ `& m" @0 S7 ^
                    {" ]8 {2 }* i* d; M; |' ^0 v
                            /* floating date operation */
    4 C" h( u, l4 K0 }* O8 j. ?                }

    - {+ G7 w5 v& x" l- M        }7 c. j5 x& e! u+ y4 d, y) j8 k
    }* e* j+ d3 O5 I( b

    ( E) O* H! q# jxcorr函数代码如上,comp是复数struct, 做过长度为11、19两个矢量的测试,和octave结果完全一样5 O5 q$ L; g" y* _7 y) ]9 O
    ' G7 Q; R& ~& I" p" s
    红色部分是内循环,现在其内部操作都comment out 了, j0大概是 6000。6 ^# l1 j8 Z  x: M2 J" p
    现在call xcorr 100次,耗时78s.
    , _% u7 j! ?# @4 j% Y5 a. a7 w4 o) E, ~$ G- N& b* X
    如果把红色部分内循环本身完全comment out, call xcorr 1000次,耗时 <1s.
    ! _# l) v6 h: `- F$ r* I+ e4 F3 ~% ~# ~
    ! U, f' N% t- Z) L& D
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    6#
     楼主| 发表于 2022-9-25 00:17:17 | 只看该作者
    风雨无阻 发表于 2022-9-24 23:33
    0 G+ O+ ~7 V4 _9 @, {- ~Maybe Debug mode?
    , G2 E% J5 Q3 }
    7 P- d0 w( l1 s( `. q" r! ?
    不应该,看我上面的回复。
    7 R) B4 N# A4 I+ T! y6 p* N1 |% z
    : r! F/ W+ o! ~. R# h我更怀疑是 VS 社区版的问题
    回复 支持 反对

    使用道具 举报

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

    [LV.Master]无

    7#
    发表于 2022-9-25 00:20:10 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 00:24 编辑
    ( X: ~& ]* T. _7 U- F$ e( o
    雷达 发表于 2022-9-24 23:54
    0 p- Z0 @1 |& o. hvoid xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    2 Q+ E! m( v8 ^* A{6 }, B. o+ f. D+ S
            comp temp, xtimesy;
    : _4 l- W/ Y, t# z' y( K3 A

    2 K( g: n3 `  V$ s  M5 s$ ~5 c这个不是这么比的吧。。。
    $ g' z. ]1 A- T( M: p
    % H- H6 s7 E6 c' _' R$ V& l& @您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。: Y# p5 K: K7 e
    - j% C& T  F1 n4 q' j, M
    而加上内循环,光jmp和dec指令就至少多执行了6000个,慢个几十倍不是正常的么?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    8#
     楼主| 发表于 2022-9-25 00:46:56 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 01:09 编辑
    7 ^" r; Y3 a3 N3 I3 t5 O
    数值分析 发表于 2022-9-25 00:20, i$ t6 i% y9 U
    这个不是这么比的吧。。。
    # r( z2 O. ~7 s/ n  ~
    * V, x7 Q, c, T- J* f# {! A您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    ) t" Z! F4 n0 U+ p1 F5 w! C( z
    / h5 Y  F' M! {. O2 x
    有道理。6 q8 ?: }# E6 H7 P4 J! |- U
    所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,记得 numeric 库里有算向量内积的,我回头试试。
    9 @5 `, x# s0 T: B+ k3 x/ `, V
    0 M0 P/ E  Y: i& v( y; M7 r; y/ r" k我先尝试尽量用标准库,一个小程序,不想搞得太复杂。多谢了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    9#
    发表于 2022-9-25 01:27:53 | 只看该作者
    雷达 发表于 2022-9-25 00:46
    6 E6 y+ m9 Q! e& E5 s有道理。
    3 @0 F1 U9 g0 i所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,这大 ...

    " L9 Q# u6 R( U/ I4 h: A' U你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子,把循环本身翻译成机器指令loop或dec/jnz,两者速度上会差很多
    5 d, m* t2 J8 i$ E( O' L4 M9 p! RWhy is the loop instruction slow? Couldn't Intel have implemented it efficiently?
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    10#
    发表于 2022-9-25 01:48:51 | 只看该作者
    数值分析 发表于 2022-9-25 00:208 v5 m- j+ o( U& s( b  z& k
    这个不是这么比的吧。。。' w4 A; m5 e% y8 d9 {
      R( g! O8 r; g7 l. s
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    而加上内循环,光jmp和dec指令就至少多执行了6000个
    * n7 _! X# W6 U" s3 o
    # }) M9 g" l1 s+ O9 {/ l
    现在的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 编辑 ; U; b% N5 d% V
    沉宝 发表于 2022-9-25 01:48
    1 ^+ N6 h/ {5 N5 e2 H3 H8 ~3 {# ~* b现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果 ...
    5 o/ e! B& v  R' g) {
    . `* v) H. f* |
    是的,兄台说的对。* N3 ]: V4 K) h4 ^1 ^
    ! l4 d/ j# `% J
    其实我想说的是 真正数值计算部分和代码中其他不直接计算的overhead的比值这个事儿。
    ) v  c7 N1 }. y3 ^9 Q% h
    / C6 E- n0 n  V0 t9 F# Q+ G: e雷达兄构造测试用例的时候,屏蔽掉了所有计算的部分,使得剩下的都是overhead,这样run time比较的结果就显得好像不合理了。如果把计算加回去,计算部分的run time会dominate,结果就不那么离谱了。因为不好说,所以用指令数对比的方式试图直观地说明这一点。  X3 m# D- S2 D: G
    - o% S& E+ `9 b! G' Y) n# W/ u3 X( b7 D
    比如说,如果有计算,那么跑六千个循环相对于计算应该用不了多少时间。但是如果一边是什么都不做,另一边是六千个循环,那六千个循环比什么都不做慢几十倍了,就不是那么不合理了。1 l$ o) d5 j  R3 g
    ) R& ]( h9 N) m% X$ k/ F& I+ J$ o
    当然也有可能像兄台说的,是优化参数的问题,但我觉得更多地是测试用例设计的不合理。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    12#
     楼主| 发表于 2022-9-25 04:47:43 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 04:49 编辑
    - J- D9 ?9 I' @" S, q2 y$ {! U0 h
    沉宝 发表于 2022-9-25 01:27
    * f; `- C- g. B- t你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子 ...
    # w" e+ Y5 R) Z0 a7 W" I; d

    9 b  e: R) O; b又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差一倍,我上面这个差的太多了。" _5 U' g6 o, r- y3 e
      {5 A4 q  D: y/ D( y3 f& R! y8 F
    我已经完全懵了。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    13#
    发表于 2022-9-25 05:51:23 | 只看该作者
    雷达 发表于 2022-9-25 04:47% a# i5 r  E# B6 F5 l* h
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...
    ) {$ A1 {( k% w  K* F, Q0 m
    时间差一倍的结果可以接受。
    & b4 h4 \3 X8 }, Q" f1 x6 y
    3 k4 y% `2 {' W& ^! W; Y3 b你还是用profile工具看看吧。现在大家都主观瞎猜。
    回复 支持 反对

    使用道具 举报

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

    [LV.Master]无

    14#
    发表于 2022-9-25 14:58:59 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 15:38 编辑 9 I2 C1 ?, y% V+ o' S/ x
    雷达 发表于 2022-9-25 04:47
    * b. r/ K" R8 j- w又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...
    6 [8 Y/ u( O# X. ^8 ?
    7 h# j+ M) `6 _2 J

    7 B" [6 w. |( x0 |  y
    ; R! n' z! H- C; [# I能不能把这个也贴上来,看看和上一个有什么不同?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    15#
     楼主| 发表于 2022-9-26 01:30:03 | 只看该作者
    本帖最后由 雷达 于 2022-9-27 01:17 编辑 8 S  |# d7 l' G3 x" }9 d% w' F
    数值分析 发表于 2022-9-25 14:587 n7 Y' p% M/ `
    能不能把这个也贴上来,看看和上一个有什么不同?
    ( e3 I( c3 I6 A9 N( E9 [+ L9 r- u1 v
    理了理思路,重新做了一个测试。
    ( e( f* S' l% \8 _* J1 d2 p做了两个 vector 和 两个 float *, 都长 100000
    : S; x1 r: W0 t5 j% i外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.. M/ }; Z  }0 P* P. A
    2 E: x- _; h  k9 U5 C7 Q5 |# X
    内循环试了4种方法,
    % h+ i5 k7 S) t. [1. 直接调用 vector inner_product 247s
    " ~& ]2 h. ~, g& w/ e2. vector 循环点乘累加 237s* m$ i0 p0 Y3 C- U
    3. float * 循环点乘累加 204s
    4 s( v" s% y2 T. i7 L1 B) C# v6 s4. 空循环 100000 次 202s
    ) y% X6 ?% f- ^6 D1 b
    # Y& I0 f- m! ^8 h9 Q7 F不做内循环 200s- E, N: S4 I5 i, q& Z
    ! o' c0 [% m: z& u
    你昨天说的对,内循环本身占比是很小的,大头在其他处理。
    $ e9 p8 i( B. n1 q6 ^9 i另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
    . V; ?9 X; L  h" ]5 k0 S3 |# j7 w2 {. t, R" |- k/ c
    至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
    , ?3 w5 y. y1 x  ?# Q/ y, `' K
    3 U/ a$ T9 Z' j, @2 w(为什么下面我贴的  b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成  jj 好了,原来 方括号里的 i 是斜体标志  LOL)
    ) U5 x8 O* [3 F8 G. X3 F) R7 z( n3 X8 d: G2 y! [# n) }5 w2 Q( G
            std::vector < float > vec1(N);
    4 g$ U" P$ G, _$ ~7 C! z        std::vector < float > vec2(N);, J9 l% ^0 m; @" |; v% Y8 H- f) N
            float* b1 = new float[N];
    * d. Y+ m4 L' ^) y9 {! `1 a  [0 B        float* b2 = new float[N];
    ! A" _, V1 h" D0 J1 g; i$ r1 l  h& b3 t+ w6 o2 ^: N, m' w* ]1 x
            for (int j = 0; j < 6000; j++)/ F) O0 ^* H  y
            {
    % n* m0 i9 o# T- L2 f                std::generate(vec1.begin(), vec1.end(), []() {+ Y# M- v5 A4 I" Z4 m. Y
                            return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;3 t& Y0 t% M# f) Y/ Z$ L3 @3 G' p/ {
                            });
    , S  L7 P% r0 J( {
    : _! m4 f. Y! i- a                std::generate(vec2.begin(), vec2.end(), []() {
    8 g/ @& A# N+ ?1 c; ^$ W. ]- m, O& B                        return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;6 T2 K6 l* O' n0 L1 I, L0 ?
                            });- l- L& c* t6 c7 V7 G( y

    - `; H8 e  h: W" `1 |8 O                for (size_t jj = 0; jj < vec1.size(); jj++)
    ( M4 w7 ~& n9 a" V2 m0 f: c1 M5 U                {. X$ f, N( d5 G
                            b1[jj] = vec1[jj];" L' |% \/ j6 |
                    }
    # D! `& i8 f' q1 r- U3 b, j
    : c7 C8 s; k: [- \5 ?+ H                for (size_t jj = 0; jj < vec2.size(); jj++)
    * E* j; f: l+ A6 v' D: E2 c( t9 }                {
    # [5 l) k. M# ?4 M) P: l* l                        b2[jj] = vec2[jj];- I( r) _! L+ w# M7 h2 b# n, d6 k; C
                    }2 E5 n' z: q) @( M  l/ Q- l' E
    " \+ O* o4 v7 }# d, g
                    //Method - 1  N=100000 247s  
    ' t8 i0 f2 f& U- U# S6 I                //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
    4 P8 G8 ~5 D4 ?3 C7 E; o: K                                / f$ O6 P6 |; o
                    //Method - 2  N=100000  237s
    ) [: X) E7 S; q: X                /*2 n% ?) C2 r& d8 t6 {) g$ B1 G
                    for (int jj = 0; jj < N ; jj++)* }4 C  }" L! E4 W" }" j
                    {% B. I) Z% ]- x( N
                            fresult += vec1[jj] * vec2[jj];
    % K. x: X# {& T) R                }
    . Y+ m  W2 s1 F. v2 X                */
    ) b  D& e/ ^) D2 c! t: `1 ^                                & F6 [$ L7 i1 j; l  {' u! M, U8 H
                    //Method - 3  N=100000 204s
    5 V; i6 X3 ?1 j0 ?2 ~1 J: \( A; T                /*
    % W; ^! l; ?3 U0 J+ g: F6 Z) F                for (int jj = 0; jj < N; jj++)4 q. T  A! o: N' \# R" a5 _
                    {
      [, {* o1 x" J. C! r6 y' J9 B* p1 [# t                        fresult += b1[jj] * b2[jj];
    $ t2 T+ P; _1 e- A# J3 y) i                }
    2 u1 a2 \6 P& \9 j* q" i. p                */& j2 V6 K- r) Z$ |& i8 b9 v5 E6 A

    2 q6 q' [! G% R: D$ }; h                //Method - 4   202s3 J  Z4 R5 Q2 k. H" S7 [. a3 S
                    /*6 j: k# i, q0 `4 A/ p! u
                    for (int jj = 0; jj < N; jj++)
    / C7 V" V% m* J. A. T                {: L3 Q7 C0 H& N/ z# \
                            
    ! \/ @1 c' G* @                }1 n3 W8 f3 Z/ M; a- m; G- A
                    */
    8 x1 |- ~) h! {5 {$ w: m" k                //comment out all methods, N=100000  202s                % Q& ]* K) I5 ~
            }
    4 ~  L# w" {- w; r
    ; Q( h' I4 _/ t# Q* a        delete []b1;
    7 r+ [9 s8 e+ z6 \. P        delete []b2;
    8 J7 I- ]! b" ?. l
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    16#
    发表于 2022-9-27 00:15:38 | 只看该作者
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?
    - N- N) K6 {6 _$ O) C; g
    ' k/ J6 U) ~0 L9 {6 t你第二个试验里面的j在循环里面又重新定义了啊,你确定真的跑了6000次?  F3 r: Q  D4 o
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    17#
     楼主| 发表于 2022-9-27 01:16:03 | 只看该作者
    机器猫 发表于 2022-9-27 00:15
    7 U! l, D: v+ K* ?% Q  Y瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?
    ' D1 u4 S& t& R7 \! s- a0 c( K" K
    # b2 E6 f/ }7 d2 s你第二个试验里面的j在循环里面又重新定义 ...
    0 ^! ]) z+ W9 r
    内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL4 P. \) f* \% ^) y; X" C) B8 S
    8 Y/ p- H+ M3 u7 z
    不和它较劲了,瞎耽误工夫,我已经转到 ubuntu, 也准备顺便试试 avx2 向量化。
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    18#
    发表于 2022-9-27 02:06:58 | 只看该作者
    雷达 发表于 2022-9-27 01:16
    # Y$ C/ Z2 s; y$ |内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL
    + Q  t/ \5 L5 z) E. ]4 c" i4 @+ c2 a, e* I) G" ]
    不和它 ...

    & |1 a& w  _2 k4 q6 Q0 n* O7 n9 ?# a, d% O" R
    不过可以试试我说的register变量。前一个试验j是混在一堆其它变量里一起定义的,很有可能是在stack上,这样内存读写会更多,要是再碰上每次都需要加载cache就更慢了。
    9 H4 K2 D4 n+ J( A4 `' i% ~5 ~- n9 h; ]后面一个是在循环那里定义的,说不定编译器就把它优化成register变量了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

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

    使用道具 举报

    该用户从未签到

    20#
    发表于 2022-9-27 20:29:50 | 只看该作者
    雷达 发表于 2022-9-24 23:54) Y' m% e# P+ ^. W  j3 W, f1 Q7 J3 R
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    3 W0 j5 `2 j% n) l{
    5 G+ c1 f8 W. l) R9 }        comp temp, xtimesy;

    ! O' e. D" u+ M" T( X) H$ q. f这个code里面如果Openmp没有被注释掉的话,那么temp那个变量应该是定义在循环里面,否则线程之间会存在争夺写入那个temp的风险。3 u3 w' o" D( o) E% U/ Q
    内层for循环如果没有内部操作的话,编译时应该被优化掉了,和你完全注册掉整个循环是一回事。可能你的编译设置没有打开优化?3 s( V! N2 ^$ `- ]- Q! g+ D
    VS社区版没有问题,我工作用的就是社区版,设置正常的话不会比商业版差。以前游说头头用Intel Compiler,他说不想花钱,而且差不了多少,就一直用到现在。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2025-11-30 22:51 , Processed in 0.039671 second(s), 20 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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