设为首页收藏本站

爱吱声

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

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

[复制链接]
  • TA的每日心情
    擦汗
    2024-12-25 23:22
  • 签到天数: 1182 天

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2022-9-24 22:54:26 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
    C++ 比 Octave 慢好多,怎么破?
    % G+ H, u, k; @3 e3 W
    * ^8 \  F% p" @+ c5 N# I/ S自相关两层循环,内层循环涉及浮点数计算,试验了一下把内层循环内部全都 comment out 只留个壳子,  但空的内层循环本身就把速度拉下来了,看来问题并不在浮点计算。' ~9 X$ I: X( Z2 ?$ o
    : P& H$ [1 P; E
    速度优化问题真的很有意思啊。
    : p6 U: X8 {; A- @2 p1 {, J5 ^( A% o$ B
    欢迎大家继续讨论

    评分

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

    查看全部评分

  • TA的每日心情
    开心
    12 小时前
  • 签到天数: 1928 天

    [LV.Master]无

    沙发
    发表于 2022-9-24 23:04:16 | 只看该作者
    拉下来?拉多少?% o3 w! a+ ~6 l% z) {9 O
    把代码贴上来看看?2 x& d3 o* R# U" e4 |4 b$ X. x: b* b" |

    ) x" n) U, i9 W+ ~; \4 ?& d难道分支预测不准破坏流水线执行?不该啊。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    板凳
    发表于 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的每日心情
    擦汗
    2024-12-25 23:22
  • 签到天数: 1182 天

    [LV.10]大乘

    5#
     楼主| 发表于 2022-9-24 23:54:10 | 只看该作者
    本帖最后由 雷达 于 2022-9-24 23:57 编辑
    3 F. f! ^8 Y/ Y1 m- ], J$ h
    数值分析 发表于 2022-9-24 23:04
    : |. @# m1 e$ M+ r! J9 P! c拉下来?拉多少?" L( ]. v) `: m
    把代码贴上来看看?

    7 u) N5 P0 S7 `2 z) A: y! Z& f4 ]: }+ t
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)  o, U. l: J& [
    {+ L5 Y! |; ~3 J# `% P& A
            comp temp, xtimesy;/ Z/ [" d& l, ]. ?1 U5 l/ ~) j1 l* l
            xtimesy.re = 0;3 }/ K' w. u* c  D( ]2 _: N
            xtimesy.im = 0;
    , t3 k9 q% k0 d; l1 `' Y        int j0 = lenB - 1;
    2 l1 _7 y9 O/ U# ~+ O2 B8 B  k6 j3 \# N        int    i, j, i1, reali;# z- _: K% ^5 K
            if (lenA % 2 == 1)
    + |0 Y8 r9 P+ [- b/ [5 {                reali = lenA + 1;* k7 r& r% p( _4 a8 J
            else- J; J- T2 W1 R+ Q* E4 S
                    reali = lenA;
    9 U# R6 c# |; I! ~9 w" @5 h  f. F% v        reali /= 2;
    ' y0 {2 L; r5 l: w2 z/ D
    / a* z2 ^' ]) ?4 r3 K; j) V        int nconv = reali + lenB;
    " k! X. T3 B0 n2 e' @" c: a, h        //#pragma omp parallel for8 V9 k2 |$ f" b3 L' S
            for (i = reali; i < nconv; i++)
    6 p) v' X1 u8 F& ]  C3 u        {( H8 i! ?3 O3 x
                    temp.re = 0;
    9 Y* x" k. w2 T8 z                temp.im = 0;
    * K. R" i; L( l9 F* \/ A3 q                i1 = i;
    ; h, R, r# C" i                for (j = j0; j >= 0; j--)5 X. d5 ?# g% N7 W3 m7 J- a" D
                    {8 n* D9 H9 L0 U  z% f3 h, Y
                            /* floating date operation */
    " G  r; ]. |% {9 ^                }
    # F+ B* {+ j3 |# U) V
            }
    + g5 ~- m3 I, R5 F1 `; F+ H}# C: x  l+ G, E# p

    " x) Q. m- o' a, pxcorr函数代码如上,comp是复数struct, 做过长度为11、19两个矢量的测试,和octave结果完全一样
    ; v/ P& Z: y& p& M; }
    . t8 f* @: c. V- V1 h* k红色部分是内循环,现在其内部操作都comment out 了, j0大概是 6000。
    8 N5 Q( y/ C& J2 x现在call xcorr 100次,耗时78s.7 y6 y% m) g5 |5 m- L1 C! p- p) O" Y
      o8 Y. S. T7 ^/ P) u
    如果把红色部分内循环本身完全comment out, call xcorr 1000次,耗时 <1s. ( x- G) V' G; r8 V! X) h0 l" n) q

    ' ?/ B1 E. e' z. m, l4 F; ~
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    擦汗
    2024-12-25 23:22
  • 签到天数: 1182 天

    [LV.10]大乘

    6#
     楼主| 发表于 2022-9-25 00:17:17 | 只看该作者
    风雨无阻 发表于 2022-9-24 23:33
    3 B6 K7 b) A/ q) l% _+ f# N5 u0 [Maybe Debug mode?
    5 w, \! Q( t+ T4 c, L+ F
    1 k) k* M7 K# W. H3 f! h/ N, n% u
    不应该,看我上面的回复。$ f3 L( R) `7 `1 J* j$ x' I% N

    8 T. `8 A) |& B( ^我更怀疑是 VS 社区版的问题
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    12 小时前
  • 签到天数: 1928 天

    [LV.Master]无

    7#
    发表于 2022-9-25 00:20:10 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 00:24 编辑
    % G# ~3 W1 Q# S6 n) F* `
    雷达 发表于 2022-9-24 23:54) Y. |! ~" b4 y( O# q
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)# Z  R/ \1 R" h/ p
    {
    4 ?- ~. h8 Z  p4 w2 A" z7 F        comp temp, xtimesy;

      O4 N; s( M# d  f  {" Y3 W  ~! o
    - V- U0 }6 @( q: n% K" A6 V8 C这个不是这么比的吧。。。
    ' F& h, N. h9 f* \% K" N; D$ ]+ W$ |2 z
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。& N. K4 p7 Y! H: T  `: P5 v4 k
    , n  P  F: {! G  [2 M1 A
    而加上内循环,光jmp和dec指令就至少多执行了6000个,慢个几十倍不是正常的么?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    擦汗
    2024-12-25 23:22
  • 签到天数: 1182 天

    [LV.10]大乘

    8#
     楼主| 发表于 2022-9-25 00:46:56 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 01:09 编辑
    ) f+ g5 i5 j4 `! q* Q
    数值分析 发表于 2022-9-25 00:20
      p( n- z3 L( u* S* C5 K; T7 ^2 b这个不是这么比的吧。。。( p$ f  @& v4 E* F1 |

    8 b3 N. G: X; @4 r/ y* C) s, b您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。

    & I9 {6 ^' V$ u
    3 _0 F6 v1 m0 t有道理。
    0 Y$ X$ G2 X5 v5 f0 x  @  p6 M所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,记得 numeric 库里有算向量内积的,我回头试试。
    1 ?1 q# a  m2 p6 h0 E  D6 V+ j
    4 p/ ?# {$ h3 {! C" R( Y7 k5 L我先尝试尽量用标准库,一个小程序,不想搞得太复杂。多谢了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    9#
    发表于 2022-9-25 01:27:53 | 只看该作者
    雷达 发表于 2022-9-25 00:46' N: O- L! l/ E7 {, u2 _
    有道理。
    3 x- I& E: }1 f& r1 A* q  @所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,这大 ...

    6 U8 N  a& C; h+ f" Y你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子,把循环本身翻译成机器指令loop或dec/jnz,两者速度上会差很多
    4 s5 U# Y* ]0 N3 x) K( mWhy is the loop instruction slow? Couldn't Intel have implemented it efficiently?
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    10#
    发表于 2022-9-25 01:48:51 | 只看该作者
    数值分析 发表于 2022-9-25 00:209 ^6 D9 P/ q, F" X0 Z7 x9 E1 d
    这个不是这么比的吧。。。: \$ Q9 G7 `: ~! ?( b) c* e

    9 j, e3 i8 P1 L9 w) |2 L$ u# o您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    而加上内循环,光jmp和dec指令就至少多执行了6000个

    ; ~! o8 G% _) X$ g/ A! \% ]. Y" ?
    现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果循环这样跑,花不了多少时间。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    12 小时前
  • 签到天数: 1928 天

    [LV.Master]无

    11#
    发表于 2022-9-25 02:06:44 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 02:16 编辑 , G; ?  a% X8 K3 G6 e
    沉宝 发表于 2022-9-25 01:48
    # w4 T1 D8 o8 H$ i$ e( A现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果 ...
    ! w0 L3 ]: g1 m' g- R- n8 l

    $ A- t3 J$ a: @/ ?% ]: ?/ d是的,兄台说的对。0 f0 t  o. F8 N9 l+ S7 }( w
    / v* X& U# V, e
    其实我想说的是 真正数值计算部分和代码中其他不直接计算的overhead的比值这个事儿。( ^/ p& u- E: D, B+ P+ e+ N
    ; B0 G* N3 g' N; S& Z* g
    雷达兄构造测试用例的时候,屏蔽掉了所有计算的部分,使得剩下的都是overhead,这样run time比较的结果就显得好像不合理了。如果把计算加回去,计算部分的run time会dominate,结果就不那么离谱了。因为不好说,所以用指令数对比的方式试图直观地说明这一点。
    ( A" |. X. q. [! C. }5 P( m7 w1 P( a/ {# c' ?
    比如说,如果有计算,那么跑六千个循环相对于计算应该用不了多少时间。但是如果一边是什么都不做,另一边是六千个循环,那六千个循环比什么都不做慢几十倍了,就不是那么不合理了。
    : ~9 u" T7 p) t) h! o2 u2 b
    5 z2 e4 J* H/ Z% [  f当然也有可能像兄台说的,是优化参数的问题,但我觉得更多地是测试用例设计的不合理。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    擦汗
    2024-12-25 23:22
  • 签到天数: 1182 天

    [LV.10]大乘

    12#
     楼主| 发表于 2022-9-25 04:47:43 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 04:49 编辑
    3 [1 p1 ~3 M. w; s: U
    沉宝 发表于 2022-9-25 01:276 v) x4 l6 U. E) c$ x6 c6 F' Q% E
    你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子 ...
    8 Y: N' e% T+ P  i/ a

    8 b( _* B/ F( Y) |# t, J3 g又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差一倍,我上面这个差的太多了。8 `) n8 c; k" _
    . C8 K$ J. t1 k: ~$ |
    我已经完全懵了。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    13#
    发表于 2022-9-25 05:51:23 | 只看该作者
    雷达 发表于 2022-9-25 04:470 D- u% m! s- A+ L' f
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...

    4 l* s3 I8 D. i6 p1 ~, |3 |时间差一倍的结果可以接受。4 {! {6 ^+ G- s" q. i5 U% J& [

    2 r7 v. P  Q8 J5 I你还是用profile工具看看吧。现在大家都主观瞎猜。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    12 小时前
  • 签到天数: 1928 天

    [LV.Master]无

    14#
    发表于 2022-9-25 14:58:59 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 15:38 编辑 0 V4 I2 J9 B' i1 x/ m2 W
    雷达 发表于 2022-9-25 04:47* i; C7 B' B: f3 M6 \3 i
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...
    $ U% s6 d" T# [) j  R% m

    ! ~$ \  E6 b+ [. A+ w. b5 {' h( d" ~( j. F, e8 J. C# l
    / `7 p$ Q; }2 O3 p+ }% a. _/ ?2 O
    能不能把这个也贴上来,看看和上一个有什么不同?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    擦汗
    2024-12-25 23:22
  • 签到天数: 1182 天

    [LV.10]大乘

    15#
     楼主| 发表于 2022-9-26 01:30:03 | 只看该作者
    本帖最后由 雷达 于 2022-9-27 01:17 编辑
    4 r- u5 ]4 A: L# m! A5 E
    数值分析 发表于 2022-9-25 14:58  d: ^, y; W) M( t) u3 e# v
    能不能把这个也贴上来,看看和上一个有什么不同?
    * N* o# k- G. y% S: y6 y
    理了理思路,重新做了一个测试。
    " u3 Y% m7 }9 ]9 K% n: v0 W做了两个 vector 和 两个 float *, 都长 1000008 y6 L. V/ k6 j5 N" q
    外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.' F8 X, |) t5 T2 j2 }

    0 T. o5 n! T6 z内循环试了4种方法,% X" Z$ J) t5 v& U+ }  w; T. A. X
    1. 直接调用 vector inner_product 247s 7 ]" \' T2 X2 e
    2. vector 循环点乘累加 237s. M! i, w: {9 Y% q  Z1 [& y
    3. float * 循环点乘累加 204s+ n4 j# q+ t+ b; g- h" S( |
    4. 空循环 100000 次 202s
    ; G7 S( v) _7 k* F5 t% ~
    $ Q- W/ X; [, C9 H& w不做内循环 200s
    . L7 z% A4 G5 R& s0 T4 s
    + Y  I9 @2 v& D! _1 k% J你昨天说的对,内循环本身占比是很小的,大头在其他处理。  a0 [( O9 I3 j6 q- `0 ]" T1 ~
    另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
    ) s* W7 I! i) T& E- W% H9 F
    ! m- t7 i# t. e  G' ?至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
    ( k9 o6 s1 f! p5 O8 r: R# r' x$ ~7 Q8 H, h1 N6 d
    (为什么下面我贴的  b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成  jj 好了,原来 方括号里的 i 是斜体标志  LOL)! L! y* S" \3 K2 I' S8 @* P7 i" g

    ) T& A; V: X3 y. I# S: e# `0 t
            std::vector < float > vec1(N);; ^6 o! g8 `) e! l# z
            std::vector < float > vec2(N);- b. j  o6 @9 [' o: Y6 b6 C
            float* b1 = new float[N];
    ) u# h' }3 F( g) D3 k/ U+ Q- Q6 a        float* b2 = new float[N];7 m1 J3 r9 c0 `

    & N7 Y: W" X$ c9 t* B& h! f        for (int j = 0; j < 6000; j++). k$ ~# ^) i. n3 \3 x2 I
            {* d& c- I: F. ~% l7 F% h
                    std::generate(vec1.begin(), vec1.end(), []() {
    ; x0 V/ _8 @  D8 j1 W                        return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
    . l8 w3 N5 b) t  |0 l% R; B$ {) U                        });! r: N6 q+ K8 T1 r$ q
    2 G/ S1 t. ~$ E4 }  @1 M- o
                    std::generate(vec2.begin(), vec2.end(), []() {+ @. X1 U8 W, ~; G9 y
                            return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;8 K: n; x# D0 D" K! L
                            });
    : @5 ], a" V9 S6 v
    % ~$ Y1 t: H( D" S                for (size_t jj = 0; jj < vec1.size(); jj++)$ t* _- m  L/ K  j' T
                    {
    - A- }* T7 h3 O, O  A- H' g                        b1[jj] = vec1[jj];/ |+ c$ I2 t+ Y2 u1 z, q7 _
                    }
    ! Y5 E- {5 g8 J( n
    3 ~. k" I3 L7 n% J1 N6 c                for (size_t jj = 0; jj < vec2.size(); jj++). o  q! m3 m, R( }
                    {
    2 v! w/ f% X" a                        b2[jj] = vec2[jj];9 r" e/ W, @$ ]/ D
                    }. s, Y, I# K9 I& {3 K

    & a: W. R/ Z) j! Z4 Q  N$ G( t. v! u2 C                //Method - 1  N=100000 247s  
    6 _. }% c1 L3 u' I; H' ]6 g                //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);" `8 a1 a; s8 [' H) A$ e, G
                                    
    ( }0 @3 ]; e. c0 u  |6 J% t, x                //Method - 2  N=100000  237s
    % P6 C. l8 ?9 C# |' ~                /*
    + O6 J+ @3 i7 j1 Q/ f4 ?5 f4 j                for (int jj = 0; jj < N ; jj++)
    9 l/ n% Z8 u  m/ ?5 ~* v4 @, D# C' W                {% c- e* A+ D9 Q3 o- R% q
                            fresult += vec1[jj] * vec2[jj];
    9 V4 M: Y8 c; e! j& N& A- n                }! G% B" F6 X8 n, q9 |
                    */& s3 E1 A  \' V/ o( o7 u! Z
                                    
    6 I9 q1 J  I# l7 L0 e* C                //Method - 3  N=100000 204s" X4 h0 N8 [7 @; d# [
                    /*
    $ n- l# k( r$ e  z                for (int jj = 0; jj < N; jj++)# a# M6 E, @9 E  ^- q) [; P
                    {
      ~; R5 Y0 Q, \                        fresult += b1[jj] * b2[jj];/ y- }! u9 X: y6 V
                    }5 X  g2 u/ C4 ]7 g
                    */  ~1 D& d6 i, z8 {3 x$ T

    & v5 ~+ Z- B4 Q                //Method - 4   202s+ B& G/ A% e# ?) U# O
                    /*
    6 E, e* l! n0 u; X. }, R: ~# g3 v                for (int jj = 0; jj < N; jj++)$ y( d! }1 w% Z3 G6 r6 }
                    {0 G* h  B+ T1 ~9 P, Q0 R  g' Y
                            2 M! n; J: Y# N* j8 r1 I8 W2 B: p
                    }
    2 ?' b1 [$ [/ t0 d9 e2 H2 k                */
    9 Z! _! E8 b. p! s' u$ |                //comment out all methods, N=100000  202s               
    ( o# ~0 m9 u% W  ^2 p        }
      J5 x! m: U0 b0 |- Z, S
    9 @$ d+ G, ?' v1 Z        delete []b1;
    - q1 e5 k8 y6 S  I2 \5 V        delete []b2;
    1 `) ]! n3 [- t1 D/ t* q1 j
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    16#
    发表于 2022-9-27 00:15:38 | 只看该作者
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?
    % r1 _  }, p  A* P2 t* U( f' Y1 p$ }1 y0 [! J5 B0 h
    你第二个试验里面的j在循环里面又重新定义了啊,你确定真的跑了6000次?
    7 M7 R, {# \$ s& f
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    擦汗
    2024-12-25 23:22
  • 签到天数: 1182 天

    [LV.10]大乘

    17#
     楼主| 发表于 2022-9-27 01:16:03 | 只看该作者
    机器猫 发表于 2022-9-27 00:15
    : T: M4 o7 Y; h2 Q, B4 X; I瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?! w; j0 e, ]& G( F7 O
    - X- t9 S2 x! d- R+ V
    你第二个试验里面的j在循环里面又重新定义 ...
    9 F8 Q7 w6 w" S8 d% L
    内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL- Y9 ~# X* U1 I2 E
    : |3 p, u9 F$ u* M& C8 P5 d. p+ [. O
    不和它较劲了,瞎耽误工夫,我已经转到 ubuntu, 也准备顺便试试 avx2 向量化。
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    18#
    发表于 2022-9-27 02:06:58 | 只看该作者
    雷达 发表于 2022-9-27 01:16. C1 ~& {& y- d% C& W# _
    内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL
    * d) I& o0 U  x; U' K7 o
    * P/ I3 a5 k3 v' X; n" G不和它 ...
    * J& f5 T$ O. j5 ?: x' s" [" r8 P
    , m- Z( y/ S+ [( ~
    不过可以试试我说的register变量。前一个试验j是混在一堆其它变量里一起定义的,很有可能是在stack上,这样内存读写会更多,要是再碰上每次都需要加载cache就更慢了。
      U% F# @. Y% c( w. @( r$ s, _% b后面一个是在循环那里定义的,说不定编译器就把它优化成register变量了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

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

    使用道具 举报

    该用户从未签到

    20#
    发表于 2022-9-27 20:29:50 | 只看该作者
    雷达 发表于 2022-9-24 23:542 ~# i4 o! O! a3 M1 K0 q4 T: l6 Y" P
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    - G  L  E2 O! [9 S/ I: ^* h5 r{# A6 F! M' \) @9 J6 |
            comp temp, xtimesy;

    3 G0 G; C( p- w8 {* o, G这个code里面如果Openmp没有被注释掉的话,那么temp那个变量应该是定义在循环里面,否则线程之间会存在争夺写入那个temp的风险。$ ~, U! ]& h* ~% q( I6 N$ l. [) F0 h
    内层for循环如果没有内部操作的话,编译时应该被优化掉了,和你完全注册掉整个循环是一回事。可能你的编译设置没有打开优化?; O: O" A; `9 X- g% q
    VS社区版没有问题,我工作用的就是社区版,设置正常的话不会比商业版差。以前游说头头用Intel Compiler,他说不想花钱,而且差不了多少,就一直用到现在。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2025-7-6 13:43 , Processed in 0.045235 second(s), 19 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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