设为首页收藏本站

爱吱声

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

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

[复制链接]
  • TA的每日心情
    怒
    2025-9-22 22:19
  • 签到天数: 1183 天

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2022-9-24 22:54:26 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
    C++ 比 Octave 慢好多,怎么破?) \, {3 p/ m4 P% H6 v3 ?+ L& k

    $ x& ~1 {* a3 H" Z! o. D* I自相关两层循环,内层循环涉及浮点数计算,试验了一下把内层循环内部全都 comment out 只留个壳子,  但空的内层循环本身就把速度拉下来了,看来问题并不在浮点计算。
    $ M5 n& O% O1 Y" a
    , d: {% g* l( i* l7 B! _速度优化问题真的很有意思啊。5 ]  g/ ], r) T- ]% f
    9 Q: {2 i9 e2 \7 O
    欢迎大家继续讨论

    评分

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

    查看全部评分

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

    [LV.Master]无

    沙发
    发表于 2022-9-24 23:04:16 | 只看该作者
    拉下来?拉多少?
    9 c  U8 n  Q) q3 e1 |* u) {2 e把代码贴上来看看?  W2 t0 i! q' e4 g, ~* c. K  i' A
    $ j9 M, [& ~8 t+ u
    难道分支预测不准破坏流水线执行?不该啊。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    板凳
    发表于 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 编辑 9 L. K" K' [% `& s& X9 p. m2 d7 s5 D% G
    数值分析 发表于 2022-9-24 23:041 N9 W% Q% B' c/ P" |8 B( u% Y
    拉下来?拉多少?" e# F: g& L9 _/ k
    把代码贴上来看看?

    $ M: E% P! e; U  G* f. X6 D# j: x% q0 @. D# j  U" X6 n) c$ l
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    1 g# M9 q  j5 g0 o0 h{
    9 F8 Q. C8 w/ U( ~. O0 m0 \        comp temp, xtimesy;
    # w. S# C; R) M; G5 N8 {" g        xtimesy.re = 0;
    3 N" l& |- [. D- D. f! r        xtimesy.im = 0;
    7 x/ [* d* B; I5 k        int j0 = lenB - 1;; P3 _# f  o: y$ C. [8 h
            int    i, j, i1, reali;
    3 x; Y  ?1 h% N& a9 E( h        if (lenA % 2 == 1)1 e( t/ x" E+ t7 z  d
                    reali = lenA + 1;
    - Z+ h2 ?% y0 _+ P4 V4 Q( Q        else
    # i# A5 I; B7 J- m( r                reali = lenA;* v& p  _" U, W6 X( V7 Y- `1 \: x- }
            reali /= 2;
    0 N1 t- t8 a: U' r5 W+ s+ v3 G5 q8 T* W, T6 |+ q  H. d
            int nconv = reali + lenB;
    ' B; i" x( f  q# F        //#pragma omp parallel for- v9 S0 R; c1 J# H/ e) I0 w4 `4 D
            for (i = reali; i < nconv; i++)
    7 s2 X& @3 s5 M- g8 n- J        {' r0 }4 g5 p2 }, T1 l
                    temp.re = 0;4 ~+ @8 r  z/ o! r6 I, a1 W# I
                    temp.im = 0;8 d% K% M" y4 U" Z& A! U
                    i1 = i;+ G/ W0 O2 y$ j+ ?- P7 c' O
                    for (j = j0; j >= 0; j--)0 O8 J! T& H8 `
                    {
      l- t: b  M. Z- g# B                        /* floating date operation */5 `2 z# v; B" i2 _% y  {# C
                    }

    # Z* k2 g6 J# J" y& X# ~5 j        }
    + |/ F. K9 s! E9 f3 j}3 @% Q% y9 M" B* _2 h6 @, V0 ^6 D

    . g+ j# k9 ?8 J1 m2 I) k7 ]- ?xcorr函数代码如上,comp是复数struct, 做过长度为11、19两个矢量的测试,和octave结果完全一样
    $ \4 @4 S" J1 i6 `/ ]1 _8 l: t9 ~* K
    红色部分是内循环,现在其内部操作都comment out 了, j0大概是 6000。
    / H, b( ~% c& ]1 f现在call xcorr 100次,耗时78s., Z! C- d7 b7 Q' R; o  G

    & Z. |, U% x, A) B8 e如果把红色部分内循环本身完全comment out, call xcorr 1000次,耗时 <1s.
    ; y! ?8 n/ ?, \4 P; z8 Y/ B
    - h8 \/ J$ _' i( U
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    怒
    2025-9-22 22:19
  • 签到天数: 1183 天

    [LV.10]大乘

    6#
     楼主| 发表于 2022-9-25 00:17:17 | 只看该作者
    风雨无阻 发表于 2022-9-24 23:33
    / ?1 p3 n( Q3 D' A: v+ I; XMaybe Debug mode?

    1 ?9 I/ L# m4 ?6 e. h1 N
    1 S0 n9 S) H; J不应该,看我上面的回复。
    $ H# U: M/ m3 e0 _! M: K8 I! w! B' \( |
    我更怀疑是 VS 社区版的问题
    回复 支持 反对

    使用道具 举报

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

    [LV.Master]无

    7#
    发表于 2022-9-25 00:20:10 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 00:24 编辑 9 A8 o; A% q  e/ y7 R/ R
    雷达 发表于 2022-9-24 23:544 G; }3 B! }. c# }4 r5 d' X
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)( r5 {+ `/ M7 C/ }/ i, u
    {% E3 u* U9 `& a! [3 b
            comp temp, xtimesy;

    + l7 u! m6 q3 Q' Q: {7 Z8 t7 A1 \" `1 o! Q, @
    这个不是这么比的吧。。。9 c& `3 G8 y" h# X

    ! F6 q$ H1 }1 C) o您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    " U1 O; R/ H- e! D& ~% m- ^3 `$ L5 w5 x3 M) C* f
    而加上内循环,光jmp和dec指令就至少多执行了6000个,慢个几十倍不是正常的么?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    怒
    2025-9-22 22:19
  • 签到天数: 1183 天

    [LV.10]大乘

    8#
     楼主| 发表于 2022-9-25 00:46:56 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 01:09 编辑
    0 L9 e2 G: {6 m, B1 m# R+ K
    数值分析 发表于 2022-9-25 00:20
    ! f- r# c1 S9 L2 |1 G+ t这个不是这么比的吧。。。0 S" P2 a6 f% `3 U

    4 ~( ~- _$ O- S  t% I; y) e) ]1 W您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。

    8 x5 p* n! ~! j1 N/ ?2 T
    / z( p5 l, J  I. P/ f" r  \! M1 C3 o& E有道理。
    * d5 b& G/ \- C/ l7 U* V8 W: L所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,记得 numeric 库里有算向量内积的,我回头试试。
    ) b- x3 l1 h$ l, R
    8 b0 q+ A* A- |% d我先尝试尽量用标准库,一个小程序,不想搞得太复杂。多谢了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    9#
    发表于 2022-9-25 01:27:53 | 只看该作者
    雷达 发表于 2022-9-25 00:46. C  Z( ~* a- M8 v$ o% Y
    有道理。
      P5 b/ `2 K% O% d3 b1 R2 n所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,这大 ...
    ! j( r% U8 u, S9 v8 J$ k
    你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子,把循环本身翻译成机器指令loop或dec/jnz,两者速度上会差很多
    9 D1 ^( c/ M: @$ G6 h, K4 X: qWhy is the loop instruction slow? Couldn't Intel have implemented it efficiently?
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    10#
    发表于 2022-9-25 01:48:51 | 只看该作者
    数值分析 发表于 2022-9-25 00:206 _3 z( V1 T; P) s# h
    这个不是这么比的吧。。。
    2 A# J" m' j. Z+ z- U4 Y5 v% [5 A2 O2 }6 Y2 }
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    而加上内循环,光jmp和dec指令就至少多执行了6000个

    " U3 a( R3 z, D7 O1 E( {
    * x; l, o0 ?7 P9 U$ t) h! K$ v, X. C现在的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 编辑 3 _0 J8 a  w; p1 C
    沉宝 发表于 2022-9-25 01:48
    5 m7 G* b$ C! f7 V& G6 M% k5 p. a现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果 ...
    $ K, ^( g& ?  x" ]

    + ^. g) {6 q# f, ?$ J! Q% ?6 }是的,兄台说的对。& T# H- L- u3 O8 G- R# r' X6 X
    6 W6 R7 [# J, v; ~7 y
    其实我想说的是 真正数值计算部分和代码中其他不直接计算的overhead的比值这个事儿。
    4 w9 I! C8 H3 t0 u# c! `. j. s
    % R) g( [3 F  A7 K5 S. W雷达兄构造测试用例的时候,屏蔽掉了所有计算的部分,使得剩下的都是overhead,这样run time比较的结果就显得好像不合理了。如果把计算加回去,计算部分的run time会dominate,结果就不那么离谱了。因为不好说,所以用指令数对比的方式试图直观地说明这一点。3 g& l3 y& x1 Q4 k. i
    ; u( g; X/ u. K, f5 a
    比如说,如果有计算,那么跑六千个循环相对于计算应该用不了多少时间。但是如果一边是什么都不做,另一边是六千个循环,那六千个循环比什么都不做慢几十倍了,就不是那么不合理了。9 B( O. Z; X4 k* }
    ) _* T+ g0 r0 E# t5 `$ f9 g
    当然也有可能像兄台说的,是优化参数的问题,但我觉得更多地是测试用例设计的不合理。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    怒
    2025-9-22 22:19
  • 签到天数: 1183 天

    [LV.10]大乘

    12#
     楼主| 发表于 2022-9-25 04:47:43 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 04:49 编辑 % j* H& r( H8 b6 x3 Z  k4 F0 d
    沉宝 发表于 2022-9-25 01:27: h3 i: V0 I" x3 _) q/ w: C
    你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子 ...

    6 [( X6 t0 U2 c- Z0 Z  R* M* |  b) x, K8 n
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差一倍,我上面这个差的太多了。
    2 W% w3 I6 n; n0 q8 x* a: I. O: R/ L+ t6 ?
    我已经完全懵了。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    13#
    发表于 2022-9-25 05:51:23 | 只看该作者
    雷达 发表于 2022-9-25 04:47
    ' ~8 @; ?- s$ D. N7 P4 `又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...

    8 X) q7 V: m5 K% Z时间差一倍的结果可以接受。
    3 X3 O$ Y  k) t; [- O3 {* C
    9 Q$ W  W- W) z) Z& S, D你还是用profile工具看看吧。现在大家都主观瞎猜。
    回复 支持 反对

    使用道具 举报

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

    [LV.Master]无

    14#
    发表于 2022-9-25 14:58:59 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 15:38 编辑
    8 u$ M- l8 `3 G6 H* D
    雷达 发表于 2022-9-25 04:47
    8 i. N4 @& W9 i1 L; A又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...
    ) b' J) Q5 u5 y4 s; {; B

    4 t, q. m1 h* W# N7 z- M0 P8 [8 M" S9 W

    * [& M$ I6 i0 y- M  G$ C  c6 j: H能不能把这个也贴上来,看看和上一个有什么不同?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    怒
    2025-9-22 22:19
  • 签到天数: 1183 天

    [LV.10]大乘

    15#
     楼主| 发表于 2022-9-26 01:30:03 | 只看该作者
    本帖最后由 雷达 于 2022-9-27 01:17 编辑
    % H+ r: ^8 @- q. q
    数值分析 发表于 2022-9-25 14:588 x$ \3 L# r1 v% @. V. I
    能不能把这个也贴上来,看看和上一个有什么不同?

    9 I' F+ u8 P, s  H理了理思路,重新做了一个测试。* w' y- X; N- I" H
    做了两个 vector 和 两个 float *, 都长 100000$ t+ @9 ?9 P2 {5 E5 k% j
    外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
    ) l9 V! f  B* K2 d. u# `/ K8 \/ ]8 \
    , J/ j6 `9 G2 c9 ~$ \" Q内循环试了4种方法,- R' _0 p0 U5 T  E+ o- [) ]
    1. 直接调用 vector inner_product 247s + s1 h/ [7 L$ P' v9 D) h
    2. vector 循环点乘累加 237s
    % E8 w5 H! X, N( O: c3. float * 循环点乘累加 204s
    2 ?/ C4 V6 I0 u" R4. 空循环 100000 次 202s( j9 p$ {* y, V5 a$ ]

    ' J, D/ _. Y: o  a% t7 F不做内循环 200s
    5 B4 [% t# Q8 A2 ~# j& p
    $ F' O3 e- z) ], W: X  J6 [你昨天说的对,内循环本身占比是很小的,大头在其他处理。' ^0 f) H' C3 i. s6 J; s3 [
    另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。- i  N, P5 @& W: }' J( G1 j
    6 ~1 E  C7 k) G6 b7 K1 ]
    至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)  S# ?' {, D" b3 }

    ; b% z6 K, l6 \(为什么下面我贴的  b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成  jj 好了,原来 方括号里的 i 是斜体标志  LOL); t1 g- {0 }0 s( C9 I! z
    ) A* B  X( o& V
            std::vector < float > vec1(N);9 g8 R4 ~" b5 v  K# ]
            std::vector < float > vec2(N);
    # \) ]$ J6 _# U  X0 y        float* b1 = new float[N];
    " k( E  @$ L" V        float* b2 = new float[N];
    # _  G1 S6 L4 |7 [. m+ s
    ; \$ B3 ^- Y3 J        for (int j = 0; j < 6000; j++)) O" f/ W1 t6 Q' z
            {, Y% O3 x& I" T# f; A4 N
                    std::generate(vec1.begin(), vec1.end(), []() {
    5 t  s5 S& V  J  d$ F6 k. b                        return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
    / j4 Y) K( \! W1 I                        });/ G, d6 e$ j6 Z( D9 l* R

    9 ?: \. H1 e$ X, C$ A9 W                std::generate(vec2.begin(), vec2.end(), []() {0 s1 y* B8 }5 S, y: X4 Q/ s3 {
                            return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
    - I: ?. ^) _* N. L  L7 _1 m9 T, @                        });
    1 \' o! B; x7 W! o; I: E/ V8 {4 ^- T4 ~9 S$ ?9 l% @
                    for (size_t jj = 0; jj < vec1.size(); jj++)
    ! S& P$ s0 D! }4 a                {$ @7 u( \! }1 X1 a+ ^
                            b1[jj] = vec1[jj];! c. _8 g* v, ^: ~2 [5 g
                    }7 D1 e, L# a( M! Z9 t2 a) z+ X, L

    ) F* T" t3 \3 w                for (size_t jj = 0; jj < vec2.size(); jj++)
    1 K5 w+ X7 \! O( X8 t& E; C( |                {& e) S% A5 g! t* i7 d
                            b2[jj] = vec2[jj];' c4 w; ]# r- i% a8 p
                    }
    7 z( z  F5 o6 k/ {9 K, o6 q1 M
    ( L$ O$ P7 G+ Z* K' y; N2 x" v                //Method - 1  N=100000 247s  
    # r' f& I: g4 [, C! K6 d                //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
    5 K/ N* o' s2 ?6 ~1 |' H( J- N                                
    8 |- u1 o, T/ W" _1 E                //Method - 2  N=100000  237s# _% s9 z* E! s+ W$ ?
                    /*
    6 T% T3 I; N- q+ ]5 p                for (int jj = 0; jj < N ; jj++)
    5 E: r2 P$ Q) ~0 u                {$ p5 r  T( P2 i0 S
                            fresult += vec1[jj] * vec2[jj];
    . \) B  O( m0 b! n) X                }/ c1 L7 Y7 O) P' s& e0 u$ O
                    */+ [" m0 e# Q" ?. u8 N5 K' O5 z, d. }5 }
                                      q* G8 o5 h4 V/ o( b9 e  O5 [
                    //Method - 3  N=100000 204s
    * f4 k+ j" w( r" i. ]                /*; o. o0 k6 D" i& w# Z8 E
                    for (int jj = 0; jj < N; jj++)
    8 }! o# r, p$ J  f2 Z                {
    3 m' P9 d0 b- M) k* u! ]* T                        fresult += b1[jj] * b2[jj];
    2 @0 ^  ~7 E* M/ h, m! ~                }
    2 n, O) J" ]9 M* |# u! @- y1 C                */  a, S4 o4 S( q  E; {

    0 p: j' j! ^2 N3 y" p! u+ f                //Method - 4   202s
      l- x- [0 G' r( K  H5 }                /*
    0 y' z5 n1 E) C# ]1 _+ ?! J8 z                for (int jj = 0; jj < N; jj++)  R/ s/ ]* g3 F! ]- ^0 s% q
                    {
    # j/ N$ z6 w+ z/ C                        
    # X" i3 W/ w8 `+ B                }
    $ ], c7 |/ H' }7 X+ U$ m9 H4 x( M9 K                */$ n) C8 f. h6 A) X9 [5 ~
                    //comment out all methods, N=100000  202s               
    1 w+ T+ x, G  }- ]        }
    * e! {* i+ U" f% y7 [  h
    $ \! R1 K( g2 i' a8 Y        delete []b1;, b  |( ^! d$ q  e2 @: ?/ m
            delete []b2;
    2 _$ ?- \$ T$ `: z. @: V
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    16#
    发表于 2022-9-27 00:15:38 | 只看该作者
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?
      ~4 D# ^" r# s
    7 Y8 T, C0 U6 D! |2 h+ j+ o2 F你第二个试验里面的j在循环里面又重新定义了啊,你确定真的跑了6000次?
    8 O* F4 ]! N+ \1 q/ P+ e6 O
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    怒
    2025-9-22 22:19
  • 签到天数: 1183 天

    [LV.10]大乘

    17#
     楼主| 发表于 2022-9-27 01:16:03 | 只看该作者
    机器猫 发表于 2022-9-27 00:159 C2 g' ]  c( Y$ m1 |0 R0 A, J
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?0 W9 p6 |3 i( `, y$ p3 W$ W/ u# @

    2 `& r2 y$ V( T0 |# ^你第二个试验里面的j在循环里面又重新定义 ...
    ; F+ a0 B. V5 }5 O7 `
    内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL, g% d; f+ z3 u. Q0 ~& G6 x
    / w  J* a' R# J# X, Z
    不和它较劲了,瞎耽误工夫,我已经转到 ubuntu, 也准备顺便试试 avx2 向量化。
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    18#
    发表于 2022-9-27 02:06:58 | 只看该作者
    雷达 发表于 2022-9-27 01:163 `4 c3 N/ r4 n( a: A' r4 Q7 W
    内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL; X$ m8 S+ G0 f

    . u! x* i  m6 {& [( }! P不和它 ...

    7 L* q3 }) @$ t0 U2 f  D) O# h: m5 ?
    不过可以试试我说的register变量。前一个试验j是混在一堆其它变量里一起定义的,很有可能是在stack上,这样内存读写会更多,要是再碰上每次都需要加载cache就更慢了。& W/ {$ A5 F) Q, ^# H% S- u
    后面一个是在循环那里定义的,说不定编译器就把它优化成register变量了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

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

    使用道具 举报

    该用户从未签到

    20#
    发表于 2022-9-27 20:29:50 | 只看该作者
    雷达 发表于 2022-9-24 23:54
    8 D" F2 p8 |$ Jvoid xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)0 Q! \: h! Z2 _0 h: P2 N
    {
    ' e, W/ d. `* o( Z1 c6 v        comp temp, xtimesy;
    5 T2 k( y% K" R3 x3 ^
    这个code里面如果Openmp没有被注释掉的话,那么temp那个变量应该是定义在循环里面,否则线程之间会存在争夺写入那个temp的风险。' G# `6 N1 {, S: \
    内层for循环如果没有内部操作的话,编译时应该被优化掉了,和你完全注册掉整个循环是一回事。可能你的编译设置没有打开优化?% c7 B& M, C! ?" E/ C
    VS社区版没有问题,我工作用的就是社区版,设置正常的话不会比商业版差。以前游说头头用Intel Compiler,他说不想花钱,而且差不了多少,就一直用到现在。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2026-9-26 02:42 , Processed in 0.086707 second(s), 24 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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