设为首页收藏本站

爱吱声

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

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2022-9-24 22:54:26 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
    C++ 比 Octave 慢好多,怎么破?+ B! \: t' _$ q( Y

    6 X. R1 x4 q7 @自相关两层循环,内层循环涉及浮点数计算,试验了一下把内层循环内部全都 comment out 只留个壳子,  但空的内层循环本身就把速度拉下来了,看来问题并不在浮点计算。6 v- s& p" b8 d4 V3 t1 ~5 ~
    ' L% R' ?1 j3 d4 _1 @
    速度优化问题真的很有意思啊。0 C, V& C5 k& w* V$ e
    * r1 h1 [1 K' {4 b
    欢迎大家继续讨论

    评分

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

    查看全部评分

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

    [LV.Master]无

    沙发
    发表于 2022-9-24 23:04:16 | 只看该作者
    拉下来?拉多少?
    ' n4 n  ^1 T/ U4 j6 x把代码贴上来看看?8 e. {2 X; y) [* x+ [

    2 ^5 Y" X* t( q3 F& I' l0 q难道分支预测不准破坏流水线执行?不该啊。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    板凳
    发表于 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 编辑
    & c( c5 Q7 y2 b' U5 H/ M
    数值分析 发表于 2022-9-24 23:048 I6 m4 Q! e# ]" ~, k
    拉下来?拉多少?" I' S" L+ n) m7 T$ ^
    把代码贴上来看看?

    2 B7 d* v8 L& K. U1 v5 W& `/ d, e# K7 w: T! t  l2 M, E5 a
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)4 e7 e) e( @  g5 I
    {
    - n2 I! O' [7 W8 p: u        comp temp, xtimesy;6 _* W+ L4 P/ K" L3 |' C# v
            xtimesy.re = 0;
    - M9 d8 q: |2 B  |0 H        xtimesy.im = 0;
    ( e9 E  }2 @/ ]1 m& d: o  m% q        int j0 = lenB - 1;
    * O, E- u9 X6 D0 u        int    i, j, i1, reali;4 }9 D: ~1 O3 M" L/ s. c
            if (lenA % 2 == 1)
    ! a% L, k3 x4 k) a! ]- k                reali = lenA + 1;( M6 }- A# M3 P& n/ M6 o5 {/ O
            else' B& N/ }2 q- k  K
                    reali = lenA;
    . H7 \  u4 k6 `) k        reali /= 2;
    8 b, I" J4 z- D% f, M5 Q) J3 o, ^# t% `& J8 l
            int nconv = reali + lenB;6 [+ x0 _2 J1 z$ Q. o
            //#pragma omp parallel for) G4 Z; q* R" i% i3 F9 c
            for (i = reali; i < nconv; i++)
    5 t& K( E( M+ A  L5 L5 Q  ~        {
    / S3 a4 L9 D& ]+ D/ F0 Z                temp.re = 0;' N* t3 r+ I( z' _2 v
                    temp.im = 0;: w) A* X4 @7 f$ @3 R
                    i1 = i;" Q# k# d  P; v. v
                    for (j = j0; j >= 0; j--)
    2 ~! o% z4 K) z6 q, ^; E                {
    9 C+ N8 ]( d1 q( X7 D3 p: O  Z                        /* floating date operation */
    2 x! ]5 P! _! L                }

    2 Z2 S$ {( ^* h        }
    / E# c2 T6 @) E}8 H( L- Q7 F9 m  j$ d
    - l  [" ~4 K1 k! k* b2 B
    xcorr函数代码如上,comp是复数struct, 做过长度为11、19两个矢量的测试,和octave结果完全一样
    / R* Q. L8 H) b& k* f2 w& e
    / j6 w5 g' a) p6 A' I- C红色部分是内循环,现在其内部操作都comment out 了, j0大概是 6000。6 r* ?/ b2 w) H
    现在call xcorr 100次,耗时78s.
    , u+ {% t7 W( r" V" [
    ( Y$ A' [. G5 V* M! p* }如果把红色部分内循环本身完全comment out, call xcorr 1000次,耗时 <1s.
    7 d* R0 ^8 d) {: E7 y" y8 n
    * \# v! u+ P% ]
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    6#
     楼主| 发表于 2022-9-25 00:17:17 | 只看该作者
    风雨无阻 发表于 2022-9-24 23:33
      }: y/ N+ m6 s7 u) dMaybe Debug mode?

    : t3 ~0 M! Q/ D
    " h5 p! B5 U# U  h不应该,看我上面的回复。8 F& B+ v3 o6 C- u9 Z& B8 ?
    ; ?/ J6 y) k" S- G
    我更怀疑是 VS 社区版的问题
    回复 支持 反对

    使用道具 举报

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

    [LV.Master]无

    7#
    发表于 2022-9-25 00:20:10 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 00:24 编辑
    ( K$ Q' B7 S4 Y) H) j* w6 v8 s
    雷达 发表于 2022-9-24 23:54
    ; T7 B$ [; r. i; {! w. M5 y9 Y# l1 ~void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)* E- q' C4 R5 o0 h7 s0 G9 Q
    {' C" _% x+ U: C: W2 d( P5 E
            comp temp, xtimesy;
    . c6 Q1 g/ Q: r3 a, K
    6 F1 t* v4 [! A" @. z( j4 B
    这个不是这么比的吧。。。" q. A  c, Y& f/ L
    ' @  N+ `7 D  ]9 ]3 }' G, J
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。6 @: w6 x& p# Z7 u0 T

    5 i7 d  B0 z. r而加上内循环,光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 x7 A0 g' I$ |3 O
    数值分析 发表于 2022-9-25 00:20
    " H8 V! w6 g9 x! a$ H8 g* d3 `5 E这个不是这么比的吧。。。8 w4 f# S: F1 W: V

    + |- `6 h0 g6 j7 y您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。

    # ~8 v9 G: I4 W' N- ~
    + B# z5 @( m1 ^- p- N1 K- B- ^( k有道理。! C) \) b2 v$ e+ w) _9 Z8 b2 T, ]
    所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,记得 numeric 库里有算向量内积的,我回头试试。
    $ C& [0 {5 \7 g3 x
    5 H5 Z. s* @3 d) d; x1 Z我先尝试尽量用标准库,一个小程序,不想搞得太复杂。多谢了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    9#
    发表于 2022-9-25 01:27:53 | 只看该作者
    雷达 发表于 2022-9-25 00:46
    * X5 A7 b. A2 X: g: ^有道理。2 Q6 M- v+ G9 \* {/ _
    所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,这大 ...
    1 |  i2 ?& h# ~2 Z& Z* J; c$ m
    你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子,把循环本身翻译成机器指令loop或dec/jnz,两者速度上会差很多5 t4 `6 K: F! P9 S& }
    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% E& {$ o9 w7 t8 u2 a# P
    这个不是这么比的吧。。。
    - C2 o1 X5 T6 `3 c9 d2 A/ O
    / o4 M7 h0 g, \: \) p3 R您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    而加上内循环,光jmp和dec指令就至少多执行了6000个

    ( z' v/ R( ]1 l4 |
    ! y, R. |  N! R# v' B2 U$ X% l- i现在的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 编辑 / g7 I/ V) g. k# h8 e  I# P9 z
    沉宝 发表于 2022-9-25 01:48
    % ]! }  R! h( Q4 U: t现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果 ...
    + Y; R$ \8 d- `) Z- i+ K0 i
    ) y: V$ W# l9 p; ~) Y( m- X
    是的,兄台说的对。! ]& K4 J9 h( `: L

    $ v7 E6 f- X& h& f& c其实我想说的是 真正数值计算部分和代码中其他不直接计算的overhead的比值这个事儿。
    : k$ k, {- w# I& H4 ^
    0 Y/ T& U1 E6 M/ V- \8 U  R雷达兄构造测试用例的时候,屏蔽掉了所有计算的部分,使得剩下的都是overhead,这样run time比较的结果就显得好像不合理了。如果把计算加回去,计算部分的run time会dominate,结果就不那么离谱了。因为不好说,所以用指令数对比的方式试图直观地说明这一点。
      g, {3 H% W+ @+ h/ y: t' O
    1 m. N4 }; s! g/ X7 r3 \比如说,如果有计算,那么跑六千个循环相对于计算应该用不了多少时间。但是如果一边是什么都不做,另一边是六千个循环,那六千个循环比什么都不做慢几十倍了,就不是那么不合理了。" Y5 K5 n- |$ z* E" N" e: ?
    3 V+ ~( i# w5 K. ^2 P. k6 p
    当然也有可能像兄台说的,是优化参数的问题,但我觉得更多地是测试用例设计的不合理。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    12#
     楼主| 发表于 2022-9-25 04:47:43 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 04:49 编辑 ( z0 S  A1 p% }6 B. u+ {
    沉宝 发表于 2022-9-25 01:27
    - H9 o& Q4 u; x( Z' r. c  B你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子 ...
    9 n8 ]  x9 t  N9 L2 c2 C' O

    $ ^- s7 O) g, _2 b. I0 f! J5 y$ x又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差一倍,我上面这个差的太多了。/ J' j( o+ y5 b  b! n/ M

    2 e* p& z% ~& ~5 |5 T* `我已经完全懵了。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    13#
    发表于 2022-9-25 05:51:23 | 只看该作者
    雷达 发表于 2022-9-25 04:47
    ! X8 Y$ g% N) C4 G2 G又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...

    " B" t0 n4 L3 m时间差一倍的结果可以接受。- S2 K! R# P( \) d( O* k
    % j, ~4 Q: T# i' _: l
    你还是用profile工具看看吧。现在大家都主观瞎猜。
    回复 支持 反对

    使用道具 举报

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

    [LV.Master]无

    14#
    发表于 2022-9-25 14:58:59 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 15:38 编辑 5 l5 z8 {% k4 x: P0 Q6 i) u
    雷达 发表于 2022-9-25 04:47
    : a8 c1 A+ {  j/ x: e; A又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...
    - M9 s  N% M4 d

    $ c: W1 ]1 S7 m; ]: I% \  g9 I# |! p4 v% W8 S2 _

    , R9 P. D+ g. _/ f* ?# }能不能把这个也贴上来,看看和上一个有什么不同?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    15#
     楼主| 发表于 2022-9-26 01:30:03 | 只看该作者
    本帖最后由 雷达 于 2022-9-27 01:17 编辑
    ! Y/ ~3 |+ x% ~# L: Y. B( \" _
    数值分析 发表于 2022-9-25 14:58
    . A! ^/ ?7 e4 M' q" V" {能不能把这个也贴上来,看看和上一个有什么不同?
    / J* A! ^& m; S* T8 G% j9 B& ^7 w
    理了理思路,重新做了一个测试。' W3 V; g% ^; }1 B4 g/ U4 `# Y
    做了两个 vector 和 两个 float *, 都长 100000/ L  I2 F: A4 t' h! d7 c4 c# u
    外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache., t  Q- [! s/ W! G
    ( w( h+ }" [) J% I
    内循环试了4种方法,
    3 `2 X% r3 u: n. ^6 k9 [1. 直接调用 vector inner_product 247s
    " ^/ j: N  m' w) }  {4 l0 Z2. vector 循环点乘累加 237s3 `  X- j$ V& ~$ x: _( F7 T
    3. float * 循环点乘累加 204s0 U/ T3 ?5 F: X* ~  ]0 g' G
    4. 空循环 100000 次 202s' }4 G+ w% r) K2 [( G2 }* H

    3 ^  Q! g, m( B2 z. M不做内循环 200s5 M( L, L- P* u3 Q8 H) J
    . e' ]" x5 n6 h0 P
    你昨天说的对,内循环本身占比是很小的,大头在其他处理。- z$ a0 Q+ w- A  p2 h0 D
    另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
    9 b5 F, ?* Y4 \( k" ?
    8 A$ D3 f8 i  l/ p5 B至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)/ O6 w  @2 a' V
    2 ~0 @3 c4 v5 m' L; o
    (为什么下面我贴的  b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成  jj 好了,原来 方括号里的 i 是斜体标志  LOL)' L" p8 x1 m' I- \* o* B* t9 v

    0 ~  _& d+ _2 M. p% T& i+ w
            std::vector < float > vec1(N);
    / i7 f8 v; O) m* n( Q5 o        std::vector < float > vec2(N);
    ( c9 k5 F; L2 W' D5 s* G* v        float* b1 = new float[N];
    & d7 E8 y  e" H/ [6 J' r' c: w" x4 ^$ R        float* b2 = new float[N];( {+ k( D8 b2 a: B' K  m3 n
    . z4 ], y7 ]+ U0 x' w
            for (int j = 0; j < 6000; j++)
    ; X" y. ^/ |: T% E2 R$ O        {/ u4 Y2 |( W5 F. C" w: p9 `/ c# M
                    std::generate(vec1.begin(), vec1.end(), []() {
    # n1 O& ~3 B) d* _4 n                        return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
    , d/ P" e8 F5 l, _) L' \" _, S5 P" a                        });; \# m# ~) Z3 J3 z# P7 F

    8 ?% J- s/ f9 L1 U0 g- C                std::generate(vec2.begin(), vec2.end(), []() {
    ; @5 K3 D2 A7 l$ G                        return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;" Q& S  P& r6 q0 m
                            });
    ( s  a! ]: _5 _/ o; \0 W( `) I- [/ j0 I# g
                    for (size_t jj = 0; jj < vec1.size(); jj++)' D6 l; N4 m/ D& ^- Q/ w- P/ B; X
                    {) Q% l* M8 z" L3 d7 E  X
                            b1[jj] = vec1[jj];
    $ o0 [4 o- @8 L7 e' N( q                }, t% R. s3 N( {3 u
    $ d& h$ b% m2 W8 g: ~1 m& d
                    for (size_t jj = 0; jj < vec2.size(); jj++)8 V5 p8 b9 ^3 Z. O( X9 s, X% ~3 W
                    {, ?9 m8 t, I- l* u6 W. u# _) J
                            b2[jj] = vec2[jj];
    3 P( A) E" m" E* [$ m9 T: L                }
    6 R7 h  D- w7 ^( C1 r/ b: |) a6 u* ^. t9 |, ^4 {" l
                    //Method - 1  N=100000 247s  + o5 G$ S/ M( R# O( X5 n1 {
                    //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
    8 i: q/ @, g( i1 _$ Q" i1 I  u* j                                
    + E# ~( Z! y9 u% @3 n                //Method - 2  N=100000  237s, ^- }: L9 Q7 A: J
                    /*
    ; r& E# P# }# s4 E# W                for (int jj = 0; jj < N ; jj++)
    ( c) ~. g1 U' i0 F$ Z* Z0 J6 M. N                {
    ' L. m) ]$ E, s' u. z$ D$ l, y                        fresult += vec1[jj] * vec2[jj];
    : W7 ^; E' t2 G; A+ ?6 s* c                }7 M; `$ U4 H3 a& _4 Y6 U. l, |8 {0 Y+ o
                    */
    " m- \6 b8 `8 M* Y; D                                0 N5 R7 A; y1 A) G9 @) Y% p
                    //Method - 3  N=100000 204s7 c0 s' W- k) J$ }7 e( u% h
                    /*5 H* n* @5 ^& x8 c9 k
                    for (int jj = 0; jj < N; jj++)
    ' G( Y& t" M4 v( X& ?, `3 F                {
    5 k8 k6 p1 F' P( G; y& N                        fresult += b1[jj] * b2[jj];
    . L9 C$ e8 W* I) M8 f( k3 X' C, w                }0 r- e( c: a. F2 M8 t
                    */
    3 [3 X/ E  M+ r! r0 ^. {9 K" G+ d
    0 `1 u- [" h2 k                //Method - 4   202s! K+ {% ~; g" Y1 n" b3 Y- _
                    /*8 O1 g5 ]3 }  Z
                    for (int jj = 0; jj < N; jj++)
    6 ^/ z2 [' F! r2 _8 X% m% j5 `6 W                {8 \- ]) l7 w9 z9 X. v
                            
    / C4 R: _( m' a" n4 j) E                }) m6 ^9 ~7 b6 {& O) l. y
                    */
    : Y, w7 W: E% ~  C; j                //comment out all methods, N=100000  202s                * o  O, D6 [7 h8 L7 R4 S
            }7 D' r1 a: Q& n8 d4 V2 C" `: {, X

    - b; }# `# z3 ^1 ~) W        delete []b1;
    : u* W4 Y, z7 d  a* n5 y        delete []b2;
    # H+ O9 T2 B8 G! G* C9 T
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    16#
    发表于 2022-9-27 00:15:38 | 只看该作者
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?
    4 B  j. R  O, i4 h. Q; v6 X- I( _0 ~) n8 m1 V; L
    你第二个试验里面的j在循环里面又重新定义了啊,你确定真的跑了6000次?3 ^& }1 m4 ^, O3 E! k$ c+ w5 j
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    17#
     楼主| 发表于 2022-9-27 01:16:03 | 只看该作者
    机器猫 发表于 2022-9-27 00:15. K: i. B7 }) D* w7 R
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?
    ; n0 T/ y/ `, @0 c0 \; W; n0 y/ m, s
    . o' x7 H' M$ a4 J你第二个试验里面的j在循环里面又重新定义 ...
    ; G% P3 y! S3 B0 X/ e2 G
    内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL1 g3 j. c  U( y0 c( [  F

    % f) C1 V7 X! \6 A" d* S( y1 m不和它较劲了,瞎耽误工夫,我已经转到 ubuntu, 也准备顺便试试 avx2 向量化。
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    18#
    发表于 2022-9-27 02:06:58 | 只看该作者
    雷达 发表于 2022-9-27 01:16$ Y4 l4 a0 Q" p
    内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL
    1 s$ u; e6 Z6 I
    % m7 z% c3 Q& _# _5 h! J不和它 ...
    - c9 U( G7 \/ A  ^8 }8 z6 G

    4 [6 o. z' T8 o不过可以试试我说的register变量。前一个试验j是混在一堆其它变量里一起定义的,很有可能是在stack上,这样内存读写会更多,要是再碰上每次都需要加载cache就更慢了。& R% x7 P: q3 l4 B1 O6 C. P8 h
    后面一个是在循环那里定义的,说不定编译器就把它优化成register变量了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

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

    使用道具 举报

    该用户从未签到

    20#
    发表于 2022-9-27 20:29:50 | 只看该作者
    雷达 发表于 2022-9-24 23:54
    % x, w9 ?- c) A  ^void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)) g0 a. f1 f. O9 n) y* G( d  }8 u* d) S
    {& X0 i& x9 l/ a4 f2 Q& K/ {
            comp temp, xtimesy;

    : H( x. W0 T0 J: z这个code里面如果Openmp没有被注释掉的话,那么temp那个变量应该是定义在循环里面,否则线程之间会存在争夺写入那个temp的风险。
    6 M4 z+ z/ w3 {; N0 s, k内层for循环如果没有内部操作的话,编译时应该被优化掉了,和你完全注册掉整个循环是一回事。可能你的编译设置没有打开优化?
    7 Q; B" q4 H3 c% o8 MVS社区版没有问题,我工作用的就是社区版,设置正常的话不会比商业版差。以前游说头头用Intel Compiler,他说不想花钱,而且差不了多少,就一直用到现在。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2026-5-8 12:52 , Processed in 0.073028 second(s), 19 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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