设为首页收藏本站

爱吱声

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

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2022-9-24 22:54:26 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
    C++ 比 Octave 慢好多,怎么破?
    - T# [% q) {, c  J8 Q8 M- ]4 o1 B
    ( V! G5 X* R1 q! s自相关两层循环,内层循环涉及浮点数计算,试验了一下把内层循环内部全都 comment out 只留个壳子,  但空的内层循环本身就把速度拉下来了,看来问题并不在浮点计算。& K! A4 U! e: ]9 O
    0 E* \' g! r/ B0 {
    速度优化问题真的很有意思啊。( w7 n- z* c4 f9 B) c% w

    : u5 E/ [. o* Q" B欢迎大家继续讨论

    评分

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

    查看全部评分

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

    [LV.Master]无

    沙发
    发表于 2022-9-24 23:04:16 | 只看该作者
    拉下来?拉多少?
    $ o$ a+ t, D9 j8 i" m! o6 i6 U把代码贴上来看看?
    0 [1 W+ g8 I) N, B* F& U/ V# Y$ v  e- \, o0 `
    难道分支预测不准破坏流水线执行?不该啊。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    板凳
    发表于 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 编辑
    $ X7 @& H5 s2 H3 i2 F+ D: ~6 L
    数值分析 发表于 2022-9-24 23:04
    ' n& Y( G( o+ @( V. ]4 g$ [3 O拉下来?拉多少?
    ; s5 }2 e( |! ]把代码贴上来看看?
    - F& ?8 ?: S* O0 L  ]' [

    ' P& ^0 |8 {' V! q' S% b0 ^/ gvoid xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)6 m3 G! h( ^$ H. y+ G, ]
    {* E: F1 @/ C  E6 \! K
            comp temp, xtimesy;/ u: f3 r# c7 N- j
            xtimesy.re = 0;
    # M# |3 ]; l8 l' M0 e# L5 S: c9 E9 Y        xtimesy.im = 0;' o: {( v# T! X3 s& i& ^
            int j0 = lenB - 1;
    4 u/ x  w  ?& @; |' [: ]        int    i, j, i1, reali;
    ; ?% h9 B! J7 X6 q' ?# T) ^" R        if (lenA % 2 == 1)$ K2 x' l$ f! \( z" \
                    reali = lenA + 1;* I2 d4 [" E, t
            else9 ^- U9 f( s/ }: U
                    reali = lenA;4 L2 j, ^$ n' f0 o& b0 s
            reali /= 2;  l" Y6 b  A0 H$ `# e5 a

    ( Q6 E/ P4 m$ E2 }2 J; Q" T        int nconv = reali + lenB;
    6 f" c  G. ]7 |5 g! q        //#pragma omp parallel for# W& u! S; Q8 S% b! c
            for (i = reali; i < nconv; i++)
    / X1 H- a, ^% }( ]) U# b        {
    . D* m, H1 j+ J: P9 O/ U( T                temp.re = 0;
    4 [4 i7 `. m( \8 ~# i4 `0 y                temp.im = 0;$ I" q! \. ?3 `* V8 I, R& U6 c
                    i1 = i;
    2 {$ e3 b2 z. {, ~5 z+ C                for (j = j0; j >= 0; j--)
    9 s) U3 w1 \  N                {+ R+ \. a0 O2 Y) |" R* T: u7 Y- n$ y  K
                            /* floating date operation */
    & m9 }, e. i! f  `- Y/ o! W                }
    7 F( V! c, B1 G/ S- }" S
            }
    * g/ h4 G2 j, F. l* C}) L# R) V% t) U3 U6 M% d9 F

    - v* t% `4 B5 i5 Dxcorr函数代码如上,comp是复数struct, 做过长度为11、19两个矢量的测试,和octave结果完全一样
    4 q  m# x, k. o* E/ p0 H. i4 u$ R* i# ?: x# d
    红色部分是内循环,现在其内部操作都comment out 了, j0大概是 6000。( d; g+ q% Z9 O. r& x- A9 z
    现在call xcorr 100次,耗时78s.3 }# K3 Z/ p% i- P" D
    ) ]% e" r+ X% E! u6 L' r
    如果把红色部分内循环本身完全comment out, call xcorr 1000次,耗时 <1s.
    * X+ k) [% f! C# u/ \, K* p6 H0 C, k1 C# n# E+ ]/ @
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    6#
     楼主| 发表于 2022-9-25 00:17:17 | 只看该作者
    风雨无阻 发表于 2022-9-24 23:33
    - z. m5 c: C7 R$ XMaybe Debug mode?
    + F  b  V* K% J9 s7 K
    ' ~) t" @; P) v8 l8 U
    不应该,看我上面的回复。* A1 J9 \% I) j1 |, h- X% L
    $ M% c* d! l5 ]- y: O
    我更怀疑是 VS 社区版的问题
    回复 支持 反对

    使用道具 举报

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

    [LV.Master]无

    7#
    发表于 2022-9-25 00:20:10 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 00:24 编辑 & h  h+ M1 r8 B& P) o
    雷达 发表于 2022-9-24 23:54% o) x5 T$ |8 ^
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)8 W5 Y6 L, C' }0 e7 ?% n3 \$ {" J7 k+ f
    {+ Q8 B- L- v- T! \4 y. V" g& P" a7 c
            comp temp, xtimesy;

    7 [  X5 X2 x& c2 g9 p- r6 R
    ( \- y0 F+ P+ w% x5 X这个不是这么比的吧。。。
    6 ]9 z. e0 D$ _& L! |* F9 }
    # F( I  a4 H; q6 Z您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    + l: D! @; U+ d0 R& h- W  ]( d3 l- |, C4 M4 h7 R, A6 n, d: j' H
    而加上内循环,光jmp和dec指令就至少多执行了6000个,慢个几十倍不是正常的么?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    8#
     楼主| 发表于 2022-9-25 00:46:56 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 01:09 编辑
    " S. W7 `. _4 k( Q) h* j6 a
    数值分析 发表于 2022-9-25 00:20  B# F/ [& G+ a3 s  x" Y7 F
    这个不是这么比的吧。。。
    # P1 Y, |  l7 ]) v1 `# j4 Y8 @" n1 ?1 j9 e4 Z' [% o: H  {6 }( p
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    2 X) H# K7 h/ G. ~0 g
    " S* A6 z  v% _
    有道理。" o0 B) v2 E& E
    所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,记得 numeric 库里有算向量内积的,我回头试试。- I# B  r( _* O# D5 @1 n! g
    4 V- t1 k, v7 m/ Y$ v
    我先尝试尽量用标准库,一个小程序,不想搞得太复杂。多谢了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    9#
    发表于 2022-9-25 01:27:53 | 只看该作者
    雷达 发表于 2022-9-25 00:464 k) l+ U2 Z5 ^+ L: A
    有道理。% j$ U3 t$ `) F0 T8 M9 e$ c; M7 ?
    所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,这大 ...

    2 B4 t+ [5 Y  \- L. d7 w& b( |你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子,把循环本身翻译成机器指令loop或dec/jnz,两者速度上会差很多6 M/ R* ^0 d1 n) i
    Why is the loop instruction slow? Couldn't Intel have implemented it efficiently?
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    10#
    发表于 2022-9-25 01:48:51 | 只看该作者
    数值分析 发表于 2022-9-25 00:201 T" D$ X1 j7 ?' l1 n. e; G
    这个不是这么比的吧。。。  m* c  `( M8 l6 M+ Q5 L# Q8 k" T
      D3 ], K) y* O1 q
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    而加上内循环,光jmp和dec指令就至少多执行了6000个

    4 t9 p: t! H. r' s) d, a7 w' j3 Z# C. H
    现在的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 v( R8 v  ]( }
    沉宝 发表于 2022-9-25 01:48% o, n4 V$ z8 K8 m  e) k
    现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果 ...
    - e- @# [+ A6 [( s

    7 m, ?; m$ r( U6 Z0 A4 W! |4 |是的,兄台说的对。/ Z% y4 O, r% e6 d6 H  r% S
    7 H2 v, C- K$ ~  z2 c
    其实我想说的是 真正数值计算部分和代码中其他不直接计算的overhead的比值这个事儿。
    + \/ @0 H. c9 N( H* h/ n. U
    " d! a/ k/ _/ r2 h' d( g' M雷达兄构造测试用例的时候,屏蔽掉了所有计算的部分,使得剩下的都是overhead,这样run time比较的结果就显得好像不合理了。如果把计算加回去,计算部分的run time会dominate,结果就不那么离谱了。因为不好说,所以用指令数对比的方式试图直观地说明这一点。1 v  i$ R( h6 j$ r/ D. R
    $ l7 A4 z+ w: b
    比如说,如果有计算,那么跑六千个循环相对于计算应该用不了多少时间。但是如果一边是什么都不做,另一边是六千个循环,那六千个循环比什么都不做慢几十倍了,就不是那么不合理了。
    0 g( P  p: w8 Y) ?9 [2 _9 [% b, A, }3 N, n4 V" s9 ~. g
    当然也有可能像兄台说的,是优化参数的问题,但我觉得更多地是测试用例设计的不合理。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    12#
     楼主| 发表于 2022-9-25 04:47:43 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 04:49 编辑 " m" G' n  C7 L2 m2 S" E
    沉宝 发表于 2022-9-25 01:27
    1 G2 p- X/ @! k9 p/ W2 M你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子 ...
    , p7 v0 Z  c' C5 G, ?' t5 y9 ?% [7 N

    ( C6 j4 l+ C& b9 E) F1 a又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差一倍,我上面这个差的太多了。! L: F1 U( \  T% L4 ~! N: K+ x
    ' z; Q# T) f, k0 I! o
    我已经完全懵了。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    13#
    发表于 2022-9-25 05:51:23 | 只看该作者
    雷达 发表于 2022-9-25 04:47
    - D- E5 B! ]/ P% D, S又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...
    ( \0 [4 s) f  t& L4 E
    时间差一倍的结果可以接受。
    / w( j% O. o- I7 B0 }6 c5 h( N0 w! l& p$ [5 k3 h
    你还是用profile工具看看吧。现在大家都主观瞎猜。
    回复 支持 反对

    使用道具 举报

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

    [LV.Master]无

    14#
    发表于 2022-9-25 14:58:59 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 15:38 编辑
    ! p8 \5 |+ f8 U& D' d! o
    雷达 发表于 2022-9-25 04:47
    8 e- L% r  R: Y* V/ l, x又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...
    - }! ~1 a" F- D4 X% X: J- i5 E
    9 O' Z4 A% k0 D- r$ b
    , r, r1 O) y# G1 w# ~7 ?& {3 j

    4 G7 P, ~9 H  T5 j" s能不能把这个也贴上来,看看和上一个有什么不同?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    15#
     楼主| 发表于 2022-9-26 01:30:03 | 只看该作者
    本帖最后由 雷达 于 2022-9-27 01:17 编辑
    " a0 w. G, i8 f' s4 }4 h$ u# }
    数值分析 发表于 2022-9-25 14:58
    5 z. _1 o2 o. U2 G能不能把这个也贴上来,看看和上一个有什么不同?
    3 Y/ C" D6 Z! M. d
    理了理思路,重新做了一个测试。
    - H2 A. y  o4 G6 w3 U4 B- _做了两个 vector 和 两个 float *, 都长 100000( U# W* ^9 `! w
    外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
    . h* J+ [( z  O+ _% S) [3 l0 H1 H0 d% I' N9 N) R
    内循环试了4种方法,
    & r6 e+ T$ H' G8 l& S/ {1. 直接调用 vector inner_product 247s ( Q( n: z; _; D2 l4 b
    2. vector 循环点乘累加 237s3 L0 a8 Z0 k) _
    3. float * 循环点乘累加 204s; ]- E8 Q* H. Z0 P  W6 K4 }( k
    4. 空循环 100000 次 202s
    ; ]; U7 ]9 c% k3 a7 _5 x% @+ z& t; a) h1 {6 p
    不做内循环 200s
    8 v% e, {  S8 \* X" r9 y& z
    ; R  w9 W4 h  C( B3 B4 M5 y# x你昨天说的对,内循环本身占比是很小的,大头在其他处理。
    + E" M/ J6 F* W2 e- X8 m另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。8 I' t( T) b! T; z
    5 n2 }3 h0 g9 U2 Z' D
    至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)/ Y* M( p. d* O

    3 {2 T/ Z9 N- P/ @) x(为什么下面我贴的  b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成  jj 好了,原来 方括号里的 i 是斜体标志  LOL)
    8 |8 Y4 \% J$ t  p  k% j* D! l( Q% M  m" B5 {6 [! W
            std::vector < float > vec1(N);# Q& a8 m4 l7 B5 h! g1 f
            std::vector < float > vec2(N);, @( W% d! `; T7 c7 l- p  V
            float* b1 = new float[N];# J+ ^" t) @+ w9 N7 V, q
            float* b2 = new float[N];
      Z9 _; ~1 o! K7 }, C
    + M3 {" O" {& G        for (int j = 0; j < 6000; j++)# H' F. F( s9 O
            {
    % k$ P5 C: `' B                std::generate(vec1.begin(), vec1.end(), []() {
    0 u& v& G+ \# m2 s                        return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
    0 \0 q  g0 m& c9 D( n& T  e; y7 y                        });9 V0 B" R+ y# Y. A
    8 j) g# a" ~# P2 `! W
                    std::generate(vec2.begin(), vec2.end(), []() {' K8 Y3 ^4 ^& w, a0 I; N  y2 b4 s# d8 ^
                            return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
    0 [6 j, G; K7 o& r5 m  K                        });& a9 h; b5 y4 X$ e
    - g. p- E# }) |9 W# _
                    for (size_t jj = 0; jj < vec1.size(); jj++)$ ^7 S% t1 Q  B3 W( ~0 k/ L  `1 x
                    {$ D" b/ [7 B8 N6 {1 ^) j
                            b1[jj] = vec1[jj];9 f# r/ H7 S5 y. s9 ~) x; ]3 v4 U, m
                    }& K, u4 A; c8 G

    , y( O3 D* J2 v# g: {# X  v5 Q$ _                for (size_t jj = 0; jj < vec2.size(); jj++)* e  A! v/ i1 v& w8 ?3 p, }
                    {0 m  M5 ?, E+ F5 H: Z) g
                            b2[jj] = vec2[jj];2 ^8 W0 @/ }) G
                    }
    8 @) d2 }+ y- X4 n/ t$ \1 L5 `9 i* `. A
                    //Method - 1  N=100000 247s  1 U7 i+ {! w9 k% x
                    //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
    ; G# Y+ j) y+ @/ l5 b0 o8 B                                $ H) Z( M8 L9 r* @5 G4 _
                    //Method - 2  N=100000  237s. ]  H+ a. S% D2 k; u
                    /*$ b1 ~" Y' r' F" W1 u
                    for (int jj = 0; jj < N ; jj++)
    ; ~6 g$ X; f( E% p0 `6 |                {
    2 F( e( c  ~; m4 h                        fresult += vec1[jj] * vec2[jj];- F3 A7 P6 K2 j% G7 e' K$ d
                    }, e: o; [9 q3 B8 m# N: ~
                    */3 A( C1 g/ j) m7 ~
                                    
    6 j8 Q! ?& _7 U* ~: d                //Method - 3  N=100000 204s
    + s$ A" Q7 d8 m2 b9 S                /*
    - x! ^% A& m, C0 J, S7 y                for (int jj = 0; jj < N; jj++)
    : L: h& v6 W, B, b% {+ Z                {
    # t) h* S. @/ ]. y# }) e2 A                        fresult += b1[jj] * b2[jj];
    ' o: r( B8 Y6 s' y4 R* j                }1 Q! S+ w$ k  P& k& Y" u% b. a" Q
                    */! D% n5 M" r; J, N1 O+ Y) h
    % b; s2 o$ U, b! I( a
                    //Method - 4   202s
    * Z+ I8 [& N  f2 F                /*! B1 I9 T# {7 Z6 b' V, Z$ H& B
                    for (int jj = 0; jj < N; jj++)6 I2 l6 Z0 b6 c' \/ M! p3 O
                    {7 ~) q  C/ N" z1 O) y  E) ^& t$ T
                            7 M: p- C* U8 ^1 Z0 I: Q; q- M: P
                    }% W& y/ u2 i6 ]! r$ r: e% m+ m" V1 Z
                    */0 U/ X1 }& _* Q( D* P. v- h
                    //comment out all methods, N=100000  202s               
    ' l" g4 z- b9 H2 K, [        }" d) B" N1 }8 e2 S; f4 I+ ~" A

    / r! E5 k  d, Z" W        delete []b1;
    0 M+ e9 ?  E4 Z$ C        delete []b2;
    ; B3 g) {" R4 i2 c3 N$ D* b
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    16#
    发表于 2022-9-27 00:15:38 | 只看该作者
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?
    5 z6 K4 K5 r2 @/ p. r
    & d" N0 a: S8 K# N' B4 S- J/ d你第二个试验里面的j在循环里面又重新定义了啊,你确定真的跑了6000次?
    # @( S! C! ~7 b) z/ Q3 ?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    17#
     楼主| 发表于 2022-9-27 01:16:03 | 只看该作者
    机器猫 发表于 2022-9-27 00:15. e/ w9 D- k4 g3 N! R: v
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?8 Q% x7 a0 S9 I% U
    4 X* v* _- B- U# K, ^
    你第二个试验里面的j在循环里面又重新定义 ...

    ! y0 G2 d; ?9 e+ S. _7 w7 _内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL( i0 x  G; m, T3 ~: j# R. C

    . H& M0 ^5 l3 H& F不和它较劲了,瞎耽误工夫,我已经转到 ubuntu, 也准备顺便试试 avx2 向量化。
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    18#
    发表于 2022-9-27 02:06:58 | 只看该作者
    雷达 发表于 2022-9-27 01:166 N& t- R* W) J# |- B; I
    内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL$ |! c4 d/ h# Q3 n# F( S6 r1 r
    ! h" P) A/ w* o% z) U+ [7 ?7 Y
    不和它 ...

    & A. c. P4 @2 v" \: Z/ F. Z' _
    4 N7 g2 r5 |$ X9 l( e( q" f不过可以试试我说的register变量。前一个试验j是混在一堆其它变量里一起定义的,很有可能是在stack上,这样内存读写会更多,要是再碰上每次都需要加载cache就更慢了。' l: d1 m& G/ I) s: y, @* U
    后面一个是在循环那里定义的,说不定编译器就把它优化成register变量了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

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

    使用道具 举报

    该用户从未签到

    20#
    发表于 2022-9-27 20:29:50 | 只看该作者
    雷达 发表于 2022-9-24 23:54
    5 D2 ]- G- V% G7 N' U* }! y. `void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    : H1 }( `( ~8 i+ r! d8 l) ]# `! S{
    5 D  h2 u& @8 [        comp temp, xtimesy;
    ) {4 }8 w& Q+ y5 m2 _
    这个code里面如果Openmp没有被注释掉的话,那么temp那个变量应该是定义在循环里面,否则线程之间会存在争夺写入那个temp的风险。3 y) x4 l/ u; O$ m' U7 |" X3 f& x+ M# c
    内层for循环如果没有内部操作的话,编译时应该被优化掉了,和你完全注册掉整个循环是一回事。可能你的编译设置没有打开优化?; U1 ^8 F, C$ R$ O. X$ q
    VS社区版没有问题,我工作用的就是社区版,设置正常的话不会比商业版差。以前游说头头用Intel Compiler,他说不想花钱,而且差不了多少,就一直用到现在。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2026-6-10 18:48 , Processed in 0.069697 second(s), 20 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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