设为首页收藏本站

爱吱声

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

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2022-9-24 22:54:26 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
    C++ 比 Octave 慢好多,怎么破?" I% K" Z, @! x$ |( n

    6 b- X7 q& O% b& C1 p( N自相关两层循环,内层循环涉及浮点数计算,试验了一下把内层循环内部全都 comment out 只留个壳子,  但空的内层循环本身就把速度拉下来了,看来问题并不在浮点计算。+ k9 \8 F" B2 q$ ^; Q

    ) D4 K1 s+ Q' W: M. @; H* H' \) U速度优化问题真的很有意思啊。1 E; g5 N! H6 h- S
    6 i. Z- r* \5 f; O2 C( X3 O2 z
    欢迎大家继续讨论

    评分

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

    查看全部评分

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

    [LV.Master]无

    沙发
    发表于 2022-9-24 23:04:16 | 只看该作者
    拉下来?拉多少?
    5 U* K8 b2 O- A) ^; Z) ^; O把代码贴上来看看?
    6 z$ s- W! {3 @/ c- z* F; E
    9 r6 T/ \# k1 e* i2 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 编辑
    2 P; z+ N0 x8 V0 R0 t& P2 y. l! x
    数值分析 发表于 2022-9-24 23:04) R7 X  S7 C0 l. q: ]5 V/ X5 r
    拉下来?拉多少?" T, {2 ^( ?4 O
    把代码贴上来看看?

    ) w" \! D( b9 d. @& F1 S# `! L! ?4 Z* L( C& Q% ^% g( v- g
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)2 `6 m; `, p$ d- b
    {
    6 s% u& u) H( }2 L& i( u% C8 o        comp temp, xtimesy;
    ) @( w: |1 D% R# c% ?' P1 A        xtimesy.re = 0;
    ! o, S1 ^5 ^! `0 o4 i) V  u  y        xtimesy.im = 0;3 Y5 C1 G; D  D7 Y0 w
            int j0 = lenB - 1;
    $ ]3 o4 O) x9 K) E! C# y        int    i, j, i1, reali;
    ( ?0 N  ?9 s+ a0 E5 s, f        if (lenA % 2 == 1)
    + \% B* V: E- M+ c1 K7 c                reali = lenA + 1;1 n0 `$ j3 B' E/ @7 |7 T& Q- c
            else
    . o4 h$ A* _  n, I1 C" c' f" u; T                reali = lenA;; A8 E7 N3 \; I: H) }: v
            reali /= 2;0 T* R8 u6 M9 |! W
    : T+ u) K5 W4 j- x2 s
            int nconv = reali + lenB;+ I( g; W+ h* C7 f/ P# h
            //#pragma omp parallel for
    2 S2 }, F2 i6 W* L! O+ [        for (i = reali; i < nconv; i++)
    ( T7 N$ X8 c8 G$ b7 n        {
    1 N7 G$ x/ N4 |6 U9 e                temp.re = 0;
    ( p- {7 k- z; d0 ~7 Z                temp.im = 0;
    ! w. h4 g9 |% k" W6 |7 V                i1 = i;/ w" z& k9 Q) s1 F' F, c( d$ i9 B. o
                    for (j = j0; j >= 0; j--)
    2 W1 A: h5 M, l& L! r0 g+ G                {
    * B" x* E0 h9 F, c# g. E                        /* floating date operation */
    0 ?1 I# R$ h& f" m/ e7 f                }

    2 N; F$ w1 t9 z! j        }
    5 l6 ]$ ?1 c9 o}& @4 f8 t8 S. h8 O  G5 d( `

    $ }; W* u# m% u) ]$ O8 ]; Q' x9 H, sxcorr函数代码如上,comp是复数struct, 做过长度为11、19两个矢量的测试,和octave结果完全一样
    9 s8 R4 v* \9 X$ `, f- V) V8 e( v* R  c4 S8 q9 g
    红色部分是内循环,现在其内部操作都comment out 了, j0大概是 6000。7 x; p' j* R( n0 n5 l7 P: J
    现在call xcorr 100次,耗时78s., I( [* P- y. B! Z0 g
    8 W0 k' a* u( K% a6 H
    如果把红色部分内循环本身完全comment out, call xcorr 1000次,耗时 <1s.
    0 r% `  O* _0 C7 h+ q8 h
    1 P8 ^5 d9 X! J6 j$ y
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    6#
     楼主| 发表于 2022-9-25 00:17:17 | 只看该作者
    风雨无阻 发表于 2022-9-24 23:33
    5 [' U( B9 Q( o2 u3 W2 _- b/ |% Q. pMaybe Debug mode?
    + e& B* |) b  w6 b' ]. q

    3 n0 [% `7 T# j/ S. J) H不应该,看我上面的回复。
    & }/ p- V6 q. N6 F# i! b0 o
    & |* o2 K" M; U0 g我更怀疑是 VS 社区版的问题
    回复 支持 反对

    使用道具 举报

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

    [LV.Master]无

    7#
    发表于 2022-9-25 00:20:10 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 00:24 编辑
    " U/ L6 k* X) S- u. E
    雷达 发表于 2022-9-24 23:54
    $ T& M; @0 Z2 D8 Kvoid xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)  n. }2 L) H  Z5 r6 u0 S' ]6 B3 v
    {
    2 o3 c5 d6 E. q- y: N- @- p! X        comp temp, xtimesy;
    0 o  g& Z8 p! c% h
    # i3 Q- |4 v* D) U' z
    这个不是这么比的吧。。。
    8 i* [; c2 l) A0 o1 k# @/ t2 P3 U5 q, p; |2 w& j" q
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    ) v& T# Y" a. Y, K9 T3 B/ t) P' b8 a) Q+ j! H* E- k
    而加上内循环,光jmp和dec指令就至少多执行了6000个,慢个几十倍不是正常的么?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    8#
     楼主| 发表于 2022-9-25 00:46:56 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 01:09 编辑
    , R& v; Z1 Z8 w. `* K" b' f
    数值分析 发表于 2022-9-25 00:20
    8 w7 d3 V+ T5 w6 E6 `这个不是这么比的吧。。。' ?6 U  ]: b( v7 o
    $ I. l. v8 |# b$ d
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    : H; u$ C# X- N7 D
    ; w; N2 [) ~* B+ ~3 R- q2 e2 z1 Y
    有道理。0 x/ H3 S/ g! t5 p; L9 s9 c  m$ O
    所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,记得 numeric 库里有算向量内积的,我回头试试。
    7 _  b6 E. t$ ^" _: C& y% \. x! }+ `7 G& n, F9 }" i
    我先尝试尽量用标准库,一个小程序,不想搞得太复杂。多谢了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    9#
    发表于 2022-9-25 01:27:53 | 只看该作者
    雷达 发表于 2022-9-25 00:46
    % x- f5 V% D9 _* g! w有道理。* a5 Q) D& G% t! h, [1 V; Y5 }
    所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,这大 ...
    ) k1 r* p8 |2 Y
    你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子,把循环本身翻译成机器指令loop或dec/jnz,两者速度上会差很多% |  K3 ?! ]9 Y  o  H) h% g# H# }- r* {
    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
      H, M; P2 N+ b, L8 I# L( C. p这个不是这么比的吧。。。/ e3 u) i" X1 Y5 _* \; x/ E
    2 D! V! p' b  y" N8 a8 g) f8 `6 M
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    而加上内循环,光jmp和dec指令就至少多执行了6000个
    9 a" {; a  ]: c; ^1 V8 [+ b

    5 @) }- }# p$ \; f% G( ^现在的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 编辑 9 h3 r. T5 Z  u3 I
    沉宝 发表于 2022-9-25 01:48
    ' j* x( @7 Q2 {5 a" N现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果 ...

    - U! X- Q2 [0 C  S
    ( l- C* s3 Z5 l3 x: x是的,兄台说的对。
    ) O  U: {3 t) `, m/ ?8 W7 N' n  n) w! k2 A% [% q
    其实我想说的是 真正数值计算部分和代码中其他不直接计算的overhead的比值这个事儿。8 C) K. E9 \. i1 f, `
    ! s1 |8 |7 T* M. `$ W6 g
    雷达兄构造测试用例的时候,屏蔽掉了所有计算的部分,使得剩下的都是overhead,这样run time比较的结果就显得好像不合理了。如果把计算加回去,计算部分的run time会dominate,结果就不那么离谱了。因为不好说,所以用指令数对比的方式试图直观地说明这一点。
    7 c5 `$ o9 S3 T+ H6 J* K0 O! X& x
      R+ ~, V8 d4 n. D! O比如说,如果有计算,那么跑六千个循环相对于计算应该用不了多少时间。但是如果一边是什么都不做,另一边是六千个循环,那六千个循环比什么都不做慢几十倍了,就不是那么不合理了。
    % n/ j: u4 q+ O$ W3 [( ?) B
    ( o7 \. c. W2 P% p, |; Q* [# t当然也有可能像兄台说的,是优化参数的问题,但我觉得更多地是测试用例设计的不合理。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    12#
     楼主| 发表于 2022-9-25 04:47:43 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 04:49 编辑 $ |! |, n% G5 ^: p, m
    沉宝 发表于 2022-9-25 01:270 W5 @7 `% N) l
    你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子 ...

    0 s; p" J  N# I: }. w: z! C; U1 e8 \  g: K8 Y/ k
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差一倍,我上面这个差的太多了。) q; o% G2 W& ?4 @0 C
    & p% c! U  x8 Z0 Y9 t
    我已经完全懵了。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    13#
    发表于 2022-9-25 05:51:23 | 只看该作者
    雷达 发表于 2022-9-25 04:47; H1 E9 X8 z; B6 M
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...

    5 f$ m, y# ?, p% X- y0 e. B+ a时间差一倍的结果可以接受。  Q7 n+ r5 @2 X8 i
    ( D7 B5 N- U/ C
    你还是用profile工具看看吧。现在大家都主观瞎猜。
    回复 支持 反对

    使用道具 举报

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

    [LV.Master]无

    14#
    发表于 2022-9-25 14:58:59 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 15:38 编辑
    * [: m# ?6 F7 c; J1 y# Z  S
    雷达 发表于 2022-9-25 04:47$ \, g# z$ ]; w  Z, S' T% J% a5 p
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...

    ; K9 c9 {0 r( l- _3 Z% `: d, ?  N2 a6 Y; a7 ^/ d- @
    ) c9 M" ?6 @/ {7 o" ?4 A, v7 T

      b& V: v4 N; U能不能把这个也贴上来,看看和上一个有什么不同?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    15#
     楼主| 发表于 2022-9-26 01:30:03 | 只看该作者
    本帖最后由 雷达 于 2022-9-27 01:17 编辑 * ?# a. H2 s! a& s% P- E
    数值分析 发表于 2022-9-25 14:58
    - L/ Z! v6 ]' h# i能不能把这个也贴上来,看看和上一个有什么不同?

    3 t) r6 j5 `0 o/ S7 k理了理思路,重新做了一个测试。  |  h0 ]' j& b/ m1 u& {
    做了两个 vector 和 两个 float *, 都长 1000009 M& D) g- p2 I$ V$ m$ u" ]
    外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
    & I3 Q# z, H- }1 T" E7 Q/ K# D  U5 s' b' o# T( G
    内循环试了4种方法,4 w2 L5 s/ d( o2 g- Y
    1. 直接调用 vector inner_product 247s
    , i. }. p, K* p: e% g2. vector 循环点乘累加 237s
    9 F& X8 B* w- I0 n- E3. float * 循环点乘累加 204s
    - b3 z: n& l- {' H2 m0 W4. 空循环 100000 次 202s) D/ O6 w/ N9 C! A+ z& `5 T& ]

    3 Z0 S! C4 y, P) [不做内循环 200s* |& {0 i$ j3 H8 O: ^8 f
    1 f7 A- w1 Q/ P& ]3 y
    你昨天说的对,内循环本身占比是很小的,大头在其他处理。
    4 l; g3 m6 c  `* c  y另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
    % X4 ^9 [0 j, v" T( U) {3 P6 f, c# i/ D8 [' Z; V# B
    至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
    0 h; U; X8 I5 M5 m, P  y* J& P( U2 R
    (为什么下面我贴的  b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成  jj 好了,原来 方括号里的 i 是斜体标志  LOL)7 k' ]8 c$ t: d; M9 ^* i

    - ]/ ?% {3 H3 J- U
            std::vector < float > vec1(N);* W# j3 z7 f4 Z6 d/ \
            std::vector < float > vec2(N);" b  a; T% y+ Z. b
            float* b1 = new float[N];4 c9 I9 O  ?1 C9 v
            float* b2 = new float[N];
    ; n" B- {& d- f# [' g; \# a  V+ _; Z# y4 m$ x/ ^
            for (int j = 0; j < 6000; j++)
    $ c. X7 }& ?5 A( u7 g' N) z        {
    5 k" }) I. F& d8 I+ ?! C1 }" ~. D! P                std::generate(vec1.begin(), vec1.end(), []() {
    7 e' e  Q( R$ z/ G$ H5 _                        return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
    " I* Z1 b* y3 k                        });$ C; V8 E/ s2 n/ {3 E
    7 M# T. |2 M5 K  c# [
                    std::generate(vec2.begin(), vec2.end(), []() {
    4 K/ c2 D, B+ [# t# A                        return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
    $ l/ W4 E1 W# N                        });- `! M' S# O6 W4 J
    6 D9 V9 e$ A6 L4 D( P+ h
                    for (size_t jj = 0; jj < vec1.size(); jj++)
    , L& z5 V; ]& r% L9 U, Q6 I                {
    8 j9 k4 ^# O( W2 G7 k                        b1[jj] = vec1[jj];# B% H  S2 E9 _; L& u* o6 v. D4 S/ Z
                    }* `% ?$ M; O+ c* S* ^
    ! ?0 W5 O0 X* G0 L6 B! w
                    for (size_t jj = 0; jj < vec2.size(); jj++)
    * K& w8 J: v  y: O5 O6 c                {( P" k5 G- `8 J; v
                            b2[jj] = vec2[jj];
    ' @1 }% t" }( r; U                }. }# u1 ]% J3 g3 w# l1 n% f8 n

    ; k, [* p( y, R  r5 b( I! m0 p+ m7 \- @                //Method - 1  N=100000 247s  
    ' n. G  K4 B5 P3 c0 |! {                //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
    : x( u2 s9 u3 a7 p( W                                
    2 a. e6 P. s1 k1 n! p! {& [" M                //Method - 2  N=100000  237s
    / t* \: |$ d5 A9 f; U) ~3 A) e                /*
    ) d; b7 C- U5 y- @- u                for (int jj = 0; jj < N ; jj++)
    & o; a% y3 O/ R6 j* J4 h                {7 `; l3 W4 y! S: t: n
                            fresult += vec1[jj] * vec2[jj];+ Z% Y& ]. M4 |2 m0 H
                    }3 A4 o+ J$ I* w7 A$ {# d7 h8 S7 q  G5 a
                    */
    7 y" L* p- Q: s                                
    5 S' `7 Z3 s% r                //Method - 3  N=100000 204s! L% Z7 `) u+ Q: }+ K
                    /*/ s" v; r" |. q+ ^$ [7 P3 C
                    for (int jj = 0; jj < N; jj++)
    ! P0 E: y0 S: Z. v* v$ C* U' F3 o                {
    ) t- X. n( }  b1 M' f0 b5 M                        fresult += b1[jj] * b2[jj];
    2 [  l; X" Q" ^# ]                }7 [* G  u. y. [1 L1 z
                    */& T6 t2 I' s, n8 S8 S

    . z1 q# w% V" p$ C                //Method - 4   202s8 s6 w0 b+ e' H( j
                    /*
    " u# f" J! C0 L& y8 V- w4 o! a1 {                for (int jj = 0; jj < N; jj++)
    ) O% U! e0 S9 P) [* H$ m                {
    ; H& e% w- R, s; b9 e" T% B7 Z                        " Z- `7 V& a6 i+ `
                    }
    ' r3 X( S1 \$ H+ {! q1 U                */0 K& n: n6 @) `1 W( c9 L
                    //comment out all methods, N=100000  202s               
    . }! ]* c: g" n0 ~+ N& a+ ?- S        }# }7 `& g9 k5 S7 z$ C

    2 u' u! W$ \' T' V9 k) ~* k2 J        delete []b1;
    ' w/ `7 m& s* {1 e# z+ x        delete []b2;
    5 S% f# i0 H+ ], O- g! @  }/ y
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    16#
    发表于 2022-9-27 00:15:38 | 只看该作者
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?
    : N( B4 j2 G' u: j# ~8 L7 A) H0 e! k4 T3 A
    你第二个试验里面的j在循环里面又重新定义了啊,你确定真的跑了6000次?
    & V/ y6 m* O. {) V: r+ A
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    17#
     楼主| 发表于 2022-9-27 01:16:03 | 只看该作者
    机器猫 发表于 2022-9-27 00:15
    6 _* _+ ~: g) m* r: f, S. j' M瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?4 _- E* M2 Q' K7 Q6 G/ L1 c3 W
    / g1 i5 \, |% l
    你第二个试验里面的j在循环里面又重新定义 ...

    ) Z6 v. E! a& J# _' o: A" \0 P1 y* j内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL
    # l+ |2 ?. }0 e1 h1 e- V& t) G3 W+ R* V$ _9 i# q# o
    不和它较劲了,瞎耽误工夫,我已经转到 ubuntu, 也准备顺便试试 avx2 向量化。
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    18#
    发表于 2022-9-27 02:06:58 | 只看该作者
    雷达 发表于 2022-9-27 01:16
    , i2 ?5 \& u8 }6 {" u  B. r( C内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL# ?9 W$ k* H& l7 p; h

    / |" b" i$ I& @7 G% _4 N5 p不和它 ...

    5 R0 p6 e7 u5 v) h, }" }
    % W. S$ f0 e5 x4 A不过可以试试我说的register变量。前一个试验j是混在一堆其它变量里一起定义的,很有可能是在stack上,这样内存读写会更多,要是再碰上每次都需要加载cache就更慢了。
    & D( N' q9 X4 H! t1 u! E后面一个是在循环那里定义的,说不定编译器就把它优化成register变量了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

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

    使用道具 举报

    该用户从未签到

    20#
    发表于 2022-9-27 20:29:50 | 只看该作者
    雷达 发表于 2022-9-24 23:54
    * A- O% [7 @, r% P5 Ivoid xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)  I# [* m: W' F* Y" r4 X4 T
    {( N5 \; e9 }6 O
            comp temp, xtimesy;
    , S, g( o5 B; c- Z6 n9 y
    这个code里面如果Openmp没有被注释掉的话,那么temp那个变量应该是定义在循环里面,否则线程之间会存在争夺写入那个temp的风险。
    " ]7 O: c% f8 G& y( ]! h内层for循环如果没有内部操作的话,编译时应该被优化掉了,和你完全注册掉整个循环是一回事。可能你的编译设置没有打开优化?" [  |, ^$ ?: Y1 \& [* ]/ }! _
    VS社区版没有问题,我工作用的就是社区版,设置正常的话不会比商业版差。以前游说头头用Intel Compiler,他说不想花钱,而且差不了多少,就一直用到现在。
    回复 支持 反对

    使用道具 举报

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

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

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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