设为首页收藏本站

爱吱声

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

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2022-9-24 22:54:26 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
    C++ 比 Octave 慢好多,怎么破?
    + ~+ E' E& @1 @
    . S  `& Z$ G5 N+ q自相关两层循环,内层循环涉及浮点数计算,试验了一下把内层循环内部全都 comment out 只留个壳子,  但空的内层循环本身就把速度拉下来了,看来问题并不在浮点计算。& }! h: }* k6 ]0 g
    0 l2 J3 A7 ?/ ?' o. \' Y  e
    速度优化问题真的很有意思啊。
    ' v+ W. H7 u0 {4 L; L% H
    # S, y% Q5 H, ?欢迎大家继续讨论

    评分

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

    查看全部评分

  • TA的每日心情
    开心
    2025-10-27 04:12
  • 签到天数: 1953 天

    [LV.Master]无

    沙发
    发表于 2022-9-24 23:04:16 | 只看该作者
    拉下来?拉多少?
      ^( u* P+ v) O# O7 z, m) |把代码贴上来看看?
    : l1 y9 P3 h4 Z( j# F' d: N1 G0 N6 ^* Z; \. @# U# T# h9 L
    难道分支预测不准破坏流水线执行?不该啊。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    板凳
    发表于 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的每日心情

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

    [LV.10]大乘

    5#
     楼主| 发表于 2022-9-24 23:54:10 | 只看该作者
    本帖最后由 雷达 于 2022-9-24 23:57 编辑
    ; w: G* l2 Y' Y1 X4 d9 v4 B# H
    数值分析 发表于 2022-9-24 23:04
    ) C# }; _$ J" w. ]拉下来?拉多少?
    0 C0 x) z- `$ f把代码贴上来看看?
    : I1 S# U  B$ L: j& ]8 r

    2 ?" C* Y' f- L) N9 W, Tvoid xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)  d+ o& f' Z$ K( \$ X0 W' p" F
    {$ b# Z, ~* [" H+ ^8 ^
            comp temp, xtimesy;! q4 c& F6 y" z
            xtimesy.re = 0;( c4 l# c$ C) L3 k& r) {8 F
            xtimesy.im = 0;
    ' A5 ~0 k9 L. F        int j0 = lenB - 1;
    ( T2 N! ]6 I' O3 h' R* V, V) M        int    i, j, i1, reali;
    & t4 o4 n) ~6 ^; W9 G+ o        if (lenA % 2 == 1)
    4 q3 s. r/ \9 f1 u                reali = lenA + 1;
    0 o3 G7 M) `6 t% A        else
    ) Y7 n' i/ q  D3 L& \  b' x6 ^                reali = lenA;# S; v: W% i8 T4 Z2 N
            reali /= 2;' x$ Z/ x; Q9 R+ b) m
    3 n; N6 J- e& t
            int nconv = reali + lenB;; d3 b- Y- A# y- N/ y+ m* f8 D
            //#pragma omp parallel for
    : q+ I$ U2 c( [. T  w3 b        for (i = reali; i < nconv; i++)
    , ?- r7 i5 a9 I3 `' u4 J        {( |2 G+ v% l* G& B; p
                    temp.re = 0;
    4 t: q9 Y  _( T% p+ ~                temp.im = 0;* V; \$ }7 [; K7 i
                    i1 = i;; [  J' n  Q  k! {. `9 x8 Q
                    for (j = j0; j >= 0; j--)
    , ?! N4 w: i% q6 y2 `9 l" t9 x5 A                {
    4 y4 J+ ^, E3 }- {- `4 w                        /* floating date operation */
    / }  O8 x1 A7 P3 U; r                }

    , D7 e# G2 i( q- \        }
    $ V2 o$ x1 c% X' ?}
    / e6 j* V/ D4 ^! ?4 X% \# J
    9 u8 \/ E2 D; W& n! h3 P0 o# uxcorr函数代码如上,comp是复数struct, 做过长度为11、19两个矢量的测试,和octave结果完全一样: ]- z8 q8 }2 U0 W2 y4 @- s

    ; ~4 R& [. E' U红色部分是内循环,现在其内部操作都comment out 了, j0大概是 6000。: f6 ]( n. ^7 }5 @3 W; _
    现在call xcorr 100次,耗时78s.
    + L/ ^: X' e* E. B. y  x- A* _, ~, i
    如果把红色部分内循环本身完全comment out, call xcorr 1000次,耗时 <1s. % ?! v$ q: o# Z2 i( Q- K* {; j

    + R! ]# N& Y0 J; u7 n0 i
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    6#
     楼主| 发表于 2022-9-25 00:17:17 | 只看该作者
    风雨无阻 发表于 2022-9-24 23:338 a6 W3 ]3 _/ c2 ^8 x
    Maybe Debug mode?
    + {4 B' |( Q- E4 U- y

    8 G- x* b) o$ s1 d! l* c1 s" L不应该,看我上面的回复。) K; s1 x3 M( z

    * p8 A9 D& h5 V! ^1 J, }我更怀疑是 VS 社区版的问题
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2025-10-27 04:12
  • 签到天数: 1953 天

    [LV.Master]无

    7#
    发表于 2022-9-25 00:20:10 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 00:24 编辑 ; A, Z; n! m3 Z/ [; V! R
    雷达 发表于 2022-9-24 23:54
    1 Q8 }8 }( @/ F6 K  I. S  X0 m: Uvoid xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    8 C. |8 r( p" w$ [( X% b/ [/ Z{" L/ N% I0 c4 [, J
            comp temp, xtimesy;

    5 l+ U0 b8 S8 p7 L' x  p/ n- {
    3 r1 O5 R, o/ X. U0 r; v这个不是这么比的吧。。。; o- A( b4 _- `6 @7 ^
    6 a" N/ y. I/ H6 u3 e' h7 t8 \
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    , U5 k' K, {9 w5 k! Q# W: Y6 T+ x0 U4 [# N7 n7 \# {% d5 \
    而加上内循环,光jmp和dec指令就至少多执行了6000个,慢个几十倍不是正常的么?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    8#
     楼主| 发表于 2022-9-25 00:46:56 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 01:09 编辑
    ( A& R! G, g3 G/ q# |
    数值分析 发表于 2022-9-25 00:20
    ' z  l% f! W9 Z这个不是这么比的吧。。。. ^; Z, n8 W9 `
      F8 Q8 J' E' j* S4 Y" }
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。

    0 |& f1 I8 J+ Q7 ?' g
    : U) Y; n. _/ d, o4 ?3 I2 t有道理。
    0 C( s/ p+ s# {1 o2 F; `, @* J所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,记得 numeric 库里有算向量内积的,我回头试试。
    9 m! D" [6 J5 ^0 u% i
    " J0 D8 {2 d  x( A% T# c' \" h我先尝试尽量用标准库,一个小程序,不想搞得太复杂。多谢了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    9#
    发表于 2022-9-25 01:27:53 | 只看该作者
    雷达 发表于 2022-9-25 00:46
    0 m6 Q5 E# y( X, U1 R有道理。
    - u9 q5 u: b) R, I+ G  F9 ~3 m) q+ N所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,这大 ...

    $ C6 h& [+ W, F! p5 C  Z! _你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子,把循环本身翻译成机器指令loop或dec/jnz,两者速度上会差很多* Y& ~0 o1 b/ ?) F
    Why is the loop instruction slow? Couldn't Intel have implemented it efficiently?
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    10#
    发表于 2022-9-25 01:48:51 | 只看该作者
    数值分析 发表于 2022-9-25 00:207 E8 H: c: L# ~+ m2 C( ]6 [: C
    这个不是这么比的吧。。。5 {2 R- |* i0 Z( o* Z3 b9 K
    % t  W. k9 Y3 ~8 {
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    而加上内循环,光jmp和dec指令就至少多执行了6000个
    # i% |$ G' Z" h! b" N' D. u

    9 o3 Y  d, q4 b现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果循环这样跑,花不了多少时间。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2025-10-27 04:12
  • 签到天数: 1953 天

    [LV.Master]无

    11#
    发表于 2022-9-25 02:06:44 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 02:16 编辑
    . L' U9 x4 {3 A
    沉宝 发表于 2022-9-25 01:48- X% L2 i: Y1 y2 u7 g2 b# u
    现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果 ...

    . E# X! m8 W( ^+ V0 f/ Z* i$ _1 i+ Y" a, L& w
    是的,兄台说的对。: m. P# J& m" j+ g. k
    2 m2 F! l% N/ {3 i
    其实我想说的是 真正数值计算部分和代码中其他不直接计算的overhead的比值这个事儿。1 U* q/ m, i4 _& z/ N2 ~

    5 L! l; u3 V- `( s雷达兄构造测试用例的时候,屏蔽掉了所有计算的部分,使得剩下的都是overhead,这样run time比较的结果就显得好像不合理了。如果把计算加回去,计算部分的run time会dominate,结果就不那么离谱了。因为不好说,所以用指令数对比的方式试图直观地说明这一点。
    . \/ [5 n! o" c. H$ ^7 q
    9 ^3 S5 m0 p4 V" n比如说,如果有计算,那么跑六千个循环相对于计算应该用不了多少时间。但是如果一边是什么都不做,另一边是六千个循环,那六千个循环比什么都不做慢几十倍了,就不是那么不合理了。
    9 b+ E- b( T( h+ l2 w9 c8 y* d3 W7 a4 @/ L. e" D3 n
    当然也有可能像兄台说的,是优化参数的问题,但我觉得更多地是测试用例设计的不合理。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    12#
     楼主| 发表于 2022-9-25 04:47:43 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 04:49 编辑
    + R. @! V9 b4 n8 T( y# D
    沉宝 发表于 2022-9-25 01:27
    ( ?, L1 p8 m$ R* i7 `3 ~% z你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子 ...

    * H; [8 s. n) c+ W6 P5 w+ e$ A# ~3 F- Y  S7 j
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差一倍,我上面这个差的太多了。
    # f, a: H" U2 `$ f' s# N: ?& d
    0 O2 P. U) f! }9 ]我已经完全懵了。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    13#
    发表于 2022-9-25 05:51:23 | 只看该作者
    雷达 发表于 2022-9-25 04:47: b+ P* @3 V( A8 F; z: }7 g
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...
    ) o* x/ |% c  y* n
    时间差一倍的结果可以接受。+ Y% t* g9 _" u4 T

    7 a4 W4 a& }0 o) ~0 l; r( x你还是用profile工具看看吧。现在大家都主观瞎猜。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2025-10-27 04:12
  • 签到天数: 1953 天

    [LV.Master]无

    14#
    发表于 2022-9-25 14:58:59 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 15:38 编辑 4 V4 L" W! s8 ?; [
    雷达 发表于 2022-9-25 04:47
    : d& F% E0 g  c$ V1 K- ?# E又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...
    : G5 t9 {, P, g/ J8 }

    # J: `: R) y9 F% X: Z
    3 K% N% J' z4 {( Y. F. s$ ?7 b0 M* L
    能不能把这个也贴上来,看看和上一个有什么不同?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    15#
     楼主| 发表于 2022-9-26 01:30:03 | 只看该作者
    本帖最后由 雷达 于 2022-9-27 01:17 编辑 ! y. f* L% ^: r" }+ W
    数值分析 发表于 2022-9-25 14:584 h6 u* K% u7 A0 ^5 Y% g7 b. S( y
    能不能把这个也贴上来,看看和上一个有什么不同?

    + O' X9 Y1 Y7 d; E9 G7 B" ^5 _理了理思路,重新做了一个测试。
    8 l1 |) M* E7 p$ ?! N做了两个 vector 和 两个 float *, 都长 100000
    ( G) y3 H3 y9 J! j  K+ y# H  B外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
    $ A& R6 y! ?' C, ?
    ) g; H& @, D+ Q) v2 W$ {- Z" N3 G4 ~, ]内循环试了4种方法,
    , [3 {# g8 J( U+ |1. 直接调用 vector inner_product 247s
    8 Q9 O" a. J8 J2 T3 v2. vector 循环点乘累加 237s* J# v) r4 x! U% h1 J9 u% [
    3. float * 循环点乘累加 204s
    - H0 b/ o% @( \1 e4 ~4. 空循环 100000 次 202s
    , R6 @3 V4 p4 |' R% M, h+ ^0 u3 T5 ~& W7 R* B- k
    不做内循环 200s" o" J' t2 R$ Y4 C, v& H9 @
    * t: V  h8 ?" j4 u0 `0 q& g
    你昨天说的对,内循环本身占比是很小的,大头在其他处理。
    % y; G8 m- ?# {; {% M' P& _. }0 z7 [0 C另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
    ( s! {  n! m2 D1 v
    & W9 O. P1 ^/ e至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
    ! j; D; [9 k4 z- t
    0 z" S9 [% }; [* Q. J(为什么下面我贴的  b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成  jj 好了,原来 方括号里的 i 是斜体标志  LOL)2 ?) ~( @( `0 a3 C/ `, s5 x* A
    : ^$ d/ m$ B% Y2 z
            std::vector < float > vec1(N);
    ' `7 e1 J% q) c  k& w& d. _        std::vector < float > vec2(N);0 a. K- w7 d. K0 U+ }0 j
            float* b1 = new float[N];
    5 @# C% c+ E  ~  N8 L) |# P        float* b2 = new float[N];; ?0 o1 w) @, D3 B8 p2 Z4 \; T2 G
    & l: H( o( o5 \' `, w9 z5 Q% R% p
            for (int j = 0; j < 6000; j++), ?$ f" ]6 d1 o9 Q& J7 d
            {
    ' S9 ]8 Z! {; z$ t* [6 p                std::generate(vec1.begin(), vec1.end(), []() {
    0 g2 D7 L9 L8 b                        return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;/ H9 Z6 R% g1 b0 U5 }9 T
                            });6 K( l& x0 l* S2 g5 W

    ) s; K$ |) ]! u# W3 T5 F( t                std::generate(vec2.begin(), vec2.end(), []() {
    ( {1 {- `& q  A9 F                        return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;" V& E! @" Y0 s' v
                            });
    + e1 ?5 m) j5 L2 V8 ?9 V' p/ D1 d. }6 r6 g: x. q
                    for (size_t jj = 0; jj < vec1.size(); jj++)
    - M; T# e. j' J/ Q% f- ]! |                {
    ; F$ }/ [) ~  Y1 q9 T* ?% H                        b1[jj] = vec1[jj];1 q5 }$ y3 O1 ~
                    }
    - v0 |3 k5 D: T, k% F% D0 S! i) T" \( C2 ~# \7 |( M" `
                    for (size_t jj = 0; jj < vec2.size(); jj++)
    ; P9 ]* r: x* G, k; I                {
    % Y/ u: E1 ~1 x4 |+ Y2 v  ^' m                        b2[jj] = vec2[jj];
    ' o) V( O' x/ M1 }* c* X- L                }
    7 o& |9 {+ v+ @' D
    9 E4 W: s' Q2 D  F: {$ [                //Method - 1  N=100000 247s  4 \  _$ ]* z: m. u* o. f
                    //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);+ c0 `, n; _+ |0 P& I9 R! w8 G
                                    2 i! [) w* z& N" V/ g  ~' S$ @
                    //Method - 2  N=100000  237s
    9 }6 V2 ~# i. p9 `/ J                /*) p7 R: i8 C0 r& @( o9 B
                    for (int jj = 0; jj < N ; jj++)
    4 E, ]# g, }9 S3 E" d8 J% i) Q                {
    6 m2 E5 H0 P: l: D                        fresult += vec1[jj] * vec2[jj];
    ; |) Q9 Q3 U6 J# ?- V                }) V0 H" @  ]7 A: _
                    */
    . _" [0 c9 w3 g                                ; o; x2 r. t$ O- _
                    //Method - 3  N=100000 204s% ~! F; d: L# G) x; y0 o: V7 f
                    /*% q& }# z  B' ~0 g5 B
                    for (int jj = 0; jj < N; jj++)5 K$ ?) x7 i! f  [& R: r
                    {
    * j7 F% |6 |% F; u$ {2 O! b: D                        fresult += b1[jj] * b2[jj];
    8 |5 p. I# _' M: g                }8 a3 P: x/ m$ G. n4 Y  T
                    */1 x8 v) C& S8 J4 P/ R9 k
    ( H: v1 ^2 b8 a/ m+ \7 n
                    //Method - 4   202s
    " p7 [4 j2 p, ?0 J/ N                /*
    : l: e* V: Q+ |% r8 r                for (int jj = 0; jj < N; jj++)
    ; H1 k: K+ i% O2 r' W! Z6 C, N                {
    8 r9 r! o$ ~! g+ P3 l$ k6 ?  z9 n                        
    ) m1 d5 H5 ~( P: |! C' c" W                }3 H! C/ ^. P9 x4 Z9 U/ o* ], Z2 \
                    */
    9 R0 b8 [, U7 O  q4 P  K' c7 `                //comment out all methods, N=100000  202s                6 u& c0 l/ |$ ~, y
            }8 Q$ R7 x- g) P; Y8 v9 {$ A1 k

    , i: x- N" s, o" G9 d. {        delete []b1;
    2 `. q& ~4 ?% Y  B        delete []b2;
    " a% e9 n* O1 l" b: u! @; s
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    16#
    发表于 2022-9-27 00:15:38 | 只看该作者
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?
    ) v9 s0 {- C. u) {, M
    - G& F! X3 \, _% s- p你第二个试验里面的j在循环里面又重新定义了啊,你确定真的跑了6000次?
    ( A1 ~4 `4 ]  n# w7 X9 t
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    17#
     楼主| 发表于 2022-9-27 01:16:03 | 只看该作者
    机器猫 发表于 2022-9-27 00:15" V" k3 L) t8 h' \9 l, d9 V
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?3 o* v6 ]6 o9 R; n3 Z
    / O: N  f" `$ m1 r4 @  {" v( D
    你第二个试验里面的j在循环里面又重新定义 ...
    , m1 ^* M8 O- {; N
    内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL
    + d) i' v0 j; ]% ~1 o  @6 l% L' m* L0 ]
    不和它较劲了,瞎耽误工夫,我已经转到 ubuntu, 也准备顺便试试 avx2 向量化。
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    18#
    发表于 2022-9-27 02:06:58 | 只看该作者
    雷达 发表于 2022-9-27 01:16
    5 l9 s. D' ~2 k) |) x9 y6 _0 g内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL
    8 u+ V' E0 w/ T# J/ }* p, A! S
    7 F# k( n- U6 o  @: X, v$ U* P# l不和它 ...

    6 v- C9 R; Y$ [+ d- O+ L7 _3 T' C2 G6 p& U& v+ c
    不过可以试试我说的register变量。前一个试验j是混在一堆其它变量里一起定义的,很有可能是在stack上,这样内存读写会更多,要是再碰上每次都需要加载cache就更慢了。
    ( b$ r3 m$ Y5 e后面一个是在循环那里定义的,说不定编译器就把它优化成register变量了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

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

    使用道具 举报

    该用户从未签到

    20#
    发表于 2022-9-27 20:29:50 | 只看该作者
    雷达 发表于 2022-9-24 23:54
    ; \; @8 Y- J2 zvoid xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    0 |5 K7 h6 [7 c: Y& X3 W# n{
    ; h2 E7 a, _8 G1 x' m9 ?/ y, L  u) T        comp temp, xtimesy;

    * Y) b& N2 k  @: C3 r( m, ^$ H这个code里面如果Openmp没有被注释掉的话,那么temp那个变量应该是定义在循环里面,否则线程之间会存在争夺写入那个temp的风险。5 i6 `2 ~: M" E; o9 ^* {
    内层for循环如果没有内部操作的话,编译时应该被优化掉了,和你完全注册掉整个循环是一回事。可能你的编译设置没有打开优化?
    ; e1 s1 |3 s# l/ l7 g5 O' KVS社区版没有问题,我工作用的就是社区版,设置正常的话不会比商业版差。以前游说头头用Intel Compiler,他说不想花钱,而且差不了多少,就一直用到现在。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2025-12-23 04:43 , Processed in 0.062470 second(s), 19 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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