设为首页收藏本站

爱吱声

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

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

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

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

    [LV.10]大乘

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

    , y8 C0 z5 m8 T& K* E自相关两层循环,内层循环涉及浮点数计算,试验了一下把内层循环内部全都 comment out 只留个壳子,  但空的内层循环本身就把速度拉下来了,看来问题并不在浮点计算。: L$ q* u* e' i  W3 u  Y. u9 m& H

    # x' J3 ~( J5 R3 Y6 S' m速度优化问题真的很有意思啊。  ]' I" D" q5 C# i
    1 b$ d9 s3 w' r3 T4 u
    欢迎大家继续讨论

    评分

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

    查看全部评分

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

    [LV.Master]无

    沙发
    发表于 2022-9-24 23:04:16 | 只看该作者
    拉下来?拉多少?
    5 `7 N: e$ L  {& A% n把代码贴上来看看?
    , r  m" ^) ]3 N, l9 ]6 C0 p9 X& g4 n6 R7 K) I
    难道分支预测不准破坏流水线执行?不该啊。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    板凳
    发表于 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 编辑 - u4 m; q" I1 H; h- x, K$ X. q4 |
    数值分析 发表于 2022-9-24 23:04
    5 A8 u3 Z1 _6 K+ x; v5 ~8 N拉下来?拉多少?$ Z9 }3 K/ r& v8 D. _
    把代码贴上来看看?
    , J. l- `* U. |
    4 K% O* W0 p  d/ z: |  D, @3 |
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)+ z0 G9 W/ U: O. n8 E
    {
    ) o; Q5 E  ^6 `6 x0 e( T4 ^2 a        comp temp, xtimesy;( F' _0 i8 d9 I; U+ w
            xtimesy.re = 0;
    * v) c: \& V6 H* W. D; ^9 ]. f/ O        xtimesy.im = 0;" @# ^" D) U  e' J7 w% h$ j; k
            int j0 = lenB - 1;3 \  R7 j' A7 c7 n- y. W: }
            int    i, j, i1, reali;( C" B+ o# G0 G( I' E. W
            if (lenA % 2 == 1)
    5 B# e# ~) S' I/ s' b) b                reali = lenA + 1;$ _9 d3 o( y4 q: E
            else
    , H6 M- F8 R4 w0 {                reali = lenA;3 U# \9 o, k  n2 ^3 U5 y
            reali /= 2;
    ! @; J0 @$ V2 f4 _3 O7 f
    2 m, i' v( d1 y& q$ l4 z        int nconv = reali + lenB;
    8 _- _; @8 z3 ~; c1 N        //#pragma omp parallel for8 C/ ]# b* N$ B: c1 a# H6 L, {
            for (i = reali; i < nconv; i++)* N& t8 u8 H0 H, Q3 F7 v9 o
            {
    # j% d9 a7 ]8 ?  B0 t6 ~) p                temp.re = 0;
    7 a7 f3 P) V/ N" T& {* f+ @                temp.im = 0;1 I7 z5 N" J" [5 L1 Z% F
                    i1 = i;6 J; T; J# Z5 R. n
                    for (j = j0; j >= 0; j--)
    , H: k0 R$ z0 V+ k                {
    8 B& {; g. B  s& |6 P6 }# T                        /* floating date operation */" L+ ]3 s9 ^/ P. q- w0 @' j
                    }
    - j1 ^/ s' }; `: P0 ^3 X% u
            }- c( |; u$ I5 |2 Z% d
    }2 w* I" L2 g" G8 {: D/ l0 e  V  s

    ! }, Q7 z4 Y/ h8 \xcorr函数代码如上,comp是复数struct, 做过长度为11、19两个矢量的测试,和octave结果完全一样
    ) H" L) ?) }) B8 Q6 }6 G6 k$ ~9 E+ u; v1 Q
    红色部分是内循环,现在其内部操作都comment out 了, j0大概是 6000。
    2 l" ~" T9 P4 R; K; N现在call xcorr 100次,耗时78s.
    ; R/ F& C0 j9 L: k3 Z+ x
    % B8 U/ Z+ B/ B) b5 Q# f如果把红色部分内循环本身完全comment out, call xcorr 1000次,耗时 <1s. ( y+ |4 c) m( w$ K% ~1 s5 [5 l4 U3 @

    2 p1 D  V2 k( _6 X
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    6#
     楼主| 发表于 2022-9-25 00:17:17 | 只看该作者
    风雨无阻 发表于 2022-9-24 23:33
    7 L0 o- i# v- M2 `+ D; S5 O9 N" NMaybe Debug mode?
    ' I& v. v  z5 p2 f7 m0 \
    & _! p& d" g& n; d: n" l  j
    不应该,看我上面的回复。
    , n7 d6 V. B# b) d" B6 _
    ( p# w+ r( Q+ B1 d/ I" R4 S6 T我更怀疑是 VS 社区版的问题
    回复 支持 反对

    使用道具 举报

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

    [LV.Master]无

    7#
    发表于 2022-9-25 00:20:10 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 00:24 编辑 / A& D4 J& X% t. Q6 I
    雷达 发表于 2022-9-24 23:547 z# a1 i1 `* s7 s" o0 X! u2 M
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
      `. K2 o# e' F" i* Z2 S! q. i! u$ X{
    ! \4 H/ V3 f3 V+ N) n3 X0 u- o        comp temp, xtimesy;
    ! ^, [* y9 m4 q( I& _5 |
    " [, x4 t1 p% n6 f. K( E$ y- r
    这个不是这么比的吧。。。
    2 \2 ?* }# o( K, e; z1 ~5 P- S' D6 r0 Q$ E& g1 r
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。- p7 a0 C  q% c0 W3 \

    8 m- e7 @  N2 T% D而加上内循环,光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 i  g5 G5 }
    数值分析 发表于 2022-9-25 00:20
    2 g" _. |/ c; Y$ U5 d  G# A  R  C& y这个不是这么比的吧。。。8 o- @. P% w# T

    1 ]' J1 n' {9 X# V  T您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    4 P8 a7 c+ L- {- u

    & a7 H* i" C% K3 m6 o( i; s# u有道理。1 O3 a+ w) M  }5 E7 x: T
    所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,记得 numeric 库里有算向量内积的,我回头试试。% u1 a) j. `- K( r* g4 f- n6 z, z/ ?5 s

    % M  I3 Y' I: c" L- ?我先尝试尽量用标准库,一个小程序,不想搞得太复杂。多谢了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    9#
    发表于 2022-9-25 01:27:53 | 只看该作者
    雷达 发表于 2022-9-25 00:46
    0 Z5 V" w  `6 f1 p6 M有道理。
    ) U. s- q3 v; P  b% X/ s2 \! Z( S/ [所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,这大 ...

    ) O$ N9 o8 _7 ^2 i$ K你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子,把循环本身翻译成机器指令loop或dec/jnz,两者速度上会差很多0 o' U6 r9 Q. U2 h6 a- ?
    Why is the loop instruction slow? Couldn't Intel have implemented it efficiently?
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    10#
    发表于 2022-9-25 01:48:51 | 只看该作者
    数值分析 发表于 2022-9-25 00:206 C) X& [. e- R2 L3 H
    这个不是这么比的吧。。。, Z/ b% }  @' Y' n

    5 F: q  C7 y, D( X, m( z! k您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    而加上内循环,光jmp和dec指令就至少多执行了6000个
    ; [, k3 a, _# U& x0 S( ^

    8 I" y+ m- [/ q6 D+ x4 u现在的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 编辑 ! `: @: \1 K6 a6 T
    沉宝 发表于 2022-9-25 01:481 g% J" R! n/ x. j
    现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果 ...

    ! F# |/ n! K# B# E8 W8 ]( x/ i/ C1 w6 E/ G. Y# C
    是的,兄台说的对。
    * P1 ~/ B: R- N3 K" F* v  v1 ^
    / I( G' L. d, T其实我想说的是 真正数值计算部分和代码中其他不直接计算的overhead的比值这个事儿。! M1 v. a; l! @
    & b/ a# I: L! |  t1 I* ^5 L
    雷达兄构造测试用例的时候,屏蔽掉了所有计算的部分,使得剩下的都是overhead,这样run time比较的结果就显得好像不合理了。如果把计算加回去,计算部分的run time会dominate,结果就不那么离谱了。因为不好说,所以用指令数对比的方式试图直观地说明这一点。& M: z5 y  D3 }( [+ _( _+ w
    + B0 T- c0 D0 b
    比如说,如果有计算,那么跑六千个循环相对于计算应该用不了多少时间。但是如果一边是什么都不做,另一边是六千个循环,那六千个循环比什么都不做慢几十倍了,就不是那么不合理了。, J8 ^! W  _9 m0 s

    1 G8 V* S. X# _" l当然也有可能像兄台说的,是优化参数的问题,但我觉得更多地是测试用例设计的不合理。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    12#
     楼主| 发表于 2022-9-25 04:47:43 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 04:49 编辑
    7 m! Q. t0 K( ^& p4 g6 D7 i
    沉宝 发表于 2022-9-25 01:27
    2 m% h1 S# ]3 q5 W你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子 ...

    9 J7 L1 m2 ]& `# {9 Z- N' l, o! w" W
    8 b' S4 U4 V2 h" k1 F3 e又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差一倍,我上面这个差的太多了。5 G4 v/ W9 \, ~& @6 O8 v$ X' x

    - C% W% Q& N7 a# m) u2 M我已经完全懵了。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    13#
    发表于 2022-9-25 05:51:23 | 只看该作者
    雷达 发表于 2022-9-25 04:479 c7 I# Q6 G+ X
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...

    4 }2 ?0 M# N4 M+ X, b1 u% w时间差一倍的结果可以接受。
    " M6 H! j9 B, e" Z" ^* t  D
    $ ]! @  i! S1 D: O你还是用profile工具看看吧。现在大家都主观瞎猜。
    回复 支持 反对

    使用道具 举报

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

    [LV.Master]无

    14#
    发表于 2022-9-25 14:58:59 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 15:38 编辑 5 Z  `0 o9 D8 @; l# _& u
    雷达 发表于 2022-9-25 04:47; M! e6 j3 |4 O$ p
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...
    ( s$ S3 a) Y! W# d

    3 \' P/ R( H3 X( w8 N$ F3 {9 [" s2 W5 _' S& I
    # q  Y! [) P: {4 _1 o8 f. {, W* r
    能不能把这个也贴上来,看看和上一个有什么不同?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    15#
     楼主| 发表于 2022-9-26 01:30:03 | 只看该作者
    本帖最后由 雷达 于 2022-9-27 01:17 编辑
    0 @. q, H8 C; p  p7 g& s9 n
    数值分析 发表于 2022-9-25 14:58! p4 I. d& l  i1 `* v
    能不能把这个也贴上来,看看和上一个有什么不同?

    7 \) J7 s* k  R理了理思路,重新做了一个测试。- V, y* l8 q- U" ]
    做了两个 vector 和 两个 float *, 都长 100000
    - ~2 K: x2 g) A" U: o外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
    ! j8 V' `, p8 n( O- n9 E! ]8 k1 \: V/ e1 U7 k
    内循环试了4种方法,% j8 h2 X; `* t! X5 C! J+ M; x
    1. 直接调用 vector inner_product 247s 9 k7 |$ g+ ]6 D- `- j; `  o
    2. vector 循环点乘累加 237s  e2 _: w! `/ o9 Y5 x( ~
    3. float * 循环点乘累加 204s
    5 E2 ~; b0 f9 F: p4. 空循环 100000 次 202s
    6 n" Q  v) ~; i
    0 A; ?) V  ~( t; Q6 S0 \5 k  n不做内循环 200s
    3 U5 A% p: @3 @3 V' E) S1 q9 ]: L/ A% `9 F! D* @- p5 H$ Q6 M/ K6 `$ V7 h
    你昨天说的对,内循环本身占比是很小的,大头在其他处理。
    3 ~7 Y0 e0 `: k2 h0 T7 E另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
    $ s; O- g, R; Q
    4 i1 \) s  _. g8 p/ I( O1 u0 K至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)9 {/ x% s; p7 p- L

    6 h3 v3 K0 t% q! }4 r  `4 ^5 \$ q(为什么下面我贴的  b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成  jj 好了,原来 方括号里的 i 是斜体标志  LOL)) A" `( t0 @8 ]) Z3 `

    6 Y' G; |/ |) Z/ y# _; D( }, G* F
            std::vector < float > vec1(N);
    0 X1 V0 K5 A0 e' _" ^. s1 B        std::vector < float > vec2(N);
    * b! G9 h7 K+ [5 G        float* b1 = new float[N];
    ) R' v) ]3 _1 U7 W9 V. A* u        float* b2 = new float[N];. A9 v3 V5 G7 v- U$ d) x4 I

    8 O% {$ H/ I9 K. g1 ^6 N- d* U        for (int j = 0; j < 6000; j++)
    1 s9 [9 d; ?) l1 \3 X5 L5 |        {2 z' Z1 U7 H& j
                    std::generate(vec1.begin(), vec1.end(), []() {
    ) F: B1 E+ K' l4 U                        return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
    9 S2 f  [2 A/ t6 p: p! w7 n* S7 p                        });
    4 Q  P& U' |8 G  z; o
    7 _1 v7 H: ]- d: X0 C' P$ I5 \" x* t                std::generate(vec2.begin(), vec2.end(), []() {
    * T( {; O( o! m/ g+ Z                        return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;' C. y# k  E  ]9 n
                            });. ~. ~' ?9 W% M( f

    4 I: v3 A1 G! c2 \- Q) ~% K                for (size_t jj = 0; jj < vec1.size(); jj++)1 D0 v( B5 c/ c- J
                    {
    7 Q8 `# C: G) {                        b1[jj] = vec1[jj];
    ) l9 B, U* w1 R) x6 w( e                }
    6 M0 L9 S  i1 _' Z5 N5 [. _) w$ C, S. `; _4 y5 z
                    for (size_t jj = 0; jj < vec2.size(); jj++)
    # r& }. i/ r7 U2 D                {& g+ x4 U- e- n, ^
                            b2[jj] = vec2[jj];( F$ C( q8 k6 a  R& a9 C, V$ A
                    }, n: P6 y; D# F+ A  T
    $ b! G$ F8 ~3 v+ o% K& A! [! a
                    //Method - 1  N=100000 247s  
    " s) {" k. @# ^$ X0 n2 d* k# f0 k                //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
    ) s* B8 @0 }& w) u7 t- K1 F. L! I6 L! L                                
    * d0 H9 Z0 I& k1 Y# \: F                //Method - 2  N=100000  237s
    ) ^$ ^( ~0 j0 G6 h) _( ?3 ]  A                /*& |  s0 T) j) _: y
                    for (int jj = 0; jj < N ; jj++)3 Y# h+ P" n( M0 {+ h; @$ i8 w
                    {
    & S1 f5 `  _" v2 J4 _2 B                        fresult += vec1[jj] * vec2[jj];( B6 F0 ^) Z- k2 }% h8 _: h
                    }' a, u) e5 R2 e1 D) S8 g  _& m! n2 F
                    */" B2 h* N6 a- T, s
                                    ! y  z1 z, p; w; R
                    //Method - 3  N=100000 204s
    $ Y( C& a" [3 K' ~( H7 S4 ^                /*
    . g( s( C: M! Q0 ?                for (int jj = 0; jj < N; jj++), n/ P. M  Y0 W5 A1 e" n
                    {7 c: ]# @/ K3 W5 b; b6 u& s
                            fresult += b1[jj] * b2[jj];
    , y: W" p( ~  O# \' V% a                }
    ; M) v% Q5 Y8 E3 L( X6 ?, z                */
    5 P% n# g& o$ B4 B1 Z, e4 z' n
    " e# }. D5 r. P% I* u                //Method - 4   202s
    $ B4 r5 ~2 x) z: f                /*
    9 G' D3 a  y4 R6 c3 k                for (int jj = 0; jj < N; jj++)2 K1 T( g: b3 d2 m8 e9 q4 D' n
                    {- i/ x& z0 {9 T+ Y
                            
    8 Y8 F# d- O! H3 j                }
    0 J2 `7 y4 e6 v; g' M6 u6 M# `$ E                */
    8 s" F# `( B, V( ]$ K                //comment out all methods, N=100000  202s                ' `8 Y6 r4 R5 n$ L
            }) P  h3 l/ O( ]# b
    4 T7 y) Y3 V( ~+ R- x8 y- s
            delete []b1;0 T7 L6 u* f5 `- k. \
            delete []b2;

    % s3 }) t: p' b: U2 E! Z; r
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    16#
    发表于 2022-9-27 00:15:38 | 只看该作者
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?; M, [* p( v3 v; \! Z% R5 H
    - E! h* Z7 m9 a+ n
    你第二个试验里面的j在循环里面又重新定义了啊,你确定真的跑了6000次?( o) _/ e6 ]5 A8 n8 y, A
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    17#
     楼主| 发表于 2022-9-27 01:16:03 | 只看该作者
    机器猫 发表于 2022-9-27 00:15
    / N& Z$ @* y3 w! x% l) N$ U瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?! r) }  o  B1 Q- |% t/ o
    3 x& r7 R2 j, F( ~$ n; t
    你第二个试验里面的j在循环里面又重新定义 ...

    5 d3 W( u' `- b# f' U" u! ]内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL
    + x$ G1 F% Z  r5 f$ M4 d6 ^7 m- |" r! B4 o
    不和它较劲了,瞎耽误工夫,我已经转到 ubuntu, 也准备顺便试试 avx2 向量化。
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    18#
    发表于 2022-9-27 02:06:58 | 只看该作者
    雷达 发表于 2022-9-27 01:16
    " h& U2 E* i: L2 |7 C+ l! @内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL5 p0 N1 ?8 E7 c8 d4 t7 ]5 z. ?1 e

    ' V  R8 E, t; v6 p$ _不和它 ...
    0 d) h; z5 x5 B( |' C# U; r0 k
    0 q1 D; N( N# \  R4 L
    不过可以试试我说的register变量。前一个试验j是混在一堆其它变量里一起定义的,很有可能是在stack上,这样内存读写会更多,要是再碰上每次都需要加载cache就更慢了。& M% e- x8 I' R6 n% C% p
    后面一个是在循环那里定义的,说不定编译器就把它优化成register变量了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

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

    使用道具 举报

    该用户从未签到

    20#
    发表于 2022-9-27 20:29:50 | 只看该作者
    雷达 发表于 2022-9-24 23:548 I" M( C. P2 K& m/ j) H: ~
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)6 r! w& ]* {4 M8 s. r& _
    {/ S2 a5 [0 {2 b" }, l' |" R1 n! _9 D
            comp temp, xtimesy;

    # A, H/ V( D* T# T- R/ a6 k这个code里面如果Openmp没有被注释掉的话,那么temp那个变量应该是定义在循环里面,否则线程之间会存在争夺写入那个temp的风险。
    ' W0 S+ L/ B3 m2 a! P内层for循环如果没有内部操作的话,编译时应该被优化掉了,和你完全注册掉整个循环是一回事。可能你的编译设置没有打开优化?' S9 O- @+ \0 g6 o3 H7 C' ^6 i) C
    VS社区版没有问题,我工作用的就是社区版,设置正常的话不会比商业版差。以前游说头头用Intel Compiler,他说不想花钱,而且差不了多少,就一直用到现在。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2026-4-27 11:01 , Processed in 0.073107 second(s), 22 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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