设为首页收藏本站

爱吱声

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

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2022-9-24 22:54:26 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
    C++ 比 Octave 慢好多,怎么破?/ y( [) `& y. v

    7 k+ d; c( b4 R自相关两层循环,内层循环涉及浮点数计算,试验了一下把内层循环内部全都 comment out 只留个壳子,  但空的内层循环本身就把速度拉下来了,看来问题并不在浮点计算。
    7 z0 ?  L$ d/ g: F" A$ d3 f+ G& c8 d# q1 ?, r5 _
    速度优化问题真的很有意思啊。. R. S8 f8 v7 m. c4 `# C$ T

    ' Y& A9 i3 Z$ C1 S7 ?+ c欢迎大家继续讨论

    评分

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

    查看全部评分

  • TA的每日心情
    开心
    2025-12-26 03:23
  • 签到天数: 1954 天

    [LV.Master]无

    沙发
    发表于 2022-9-24 23:04:16 | 只看该作者
    拉下来?拉多少?& T' v( G: a3 k& O& [
    把代码贴上来看看?
    ) M# F$ w- P6 G5 d: _) x# P2 q% w6 Z/ b, r
    难道分支预测不准破坏流水线执行?不该啊。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    板凳
    发表于 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 编辑 + X, K; P! X2 D1 l4 b) h1 s  |2 a( F
    数值分析 发表于 2022-9-24 23:04
    ' d, ~) N9 e" P# F" @! G拉下来?拉多少?
    $ s, A% D; X- [! N$ O7 ^2 x把代码贴上来看看?
    + d9 A) _& i. L, [5 D% U1 `, {

    . [2 l/ _* Y* a7 R+ O" R7 Cvoid xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)* G6 c: p: Y" m. f/ l+ U
    {: o4 w/ K$ Y; V4 T7 x
            comp temp, xtimesy;
    4 Z) ?  w. H; V! L# Z        xtimesy.re = 0;/ i* a3 p2 _5 v7 v. F) n
            xtimesy.im = 0;* Q. d" W8 W3 S' [7 R, [6 C
            int j0 = lenB - 1;% @! I7 U1 ^1 q  T0 c8 ?7 Z
            int    i, j, i1, reali;: \6 c) Q" D3 E! Y2 c/ J
            if (lenA % 2 == 1)
    . Q+ U8 c! R: |                reali = lenA + 1;; F" S% S" d0 R) s2 B
            else2 p+ V9 r- q9 C' q
                    reali = lenA;
    ' ~# E9 ]% p% @( h6 l% K2 {        reali /= 2;
    # T& I; R) n8 ~5 e9 @, _/ ~+ v0 g0 Y9 a! G
            int nconv = reali + lenB;! Q% `- a1 B; W/ o
            //#pragma omp parallel for
    ( C; B, q. A* D        for (i = reali; i < nconv; i++)
    8 D  p. d' G) n1 I8 B( Z/ [        {# y7 s" o! e4 _. J+ T
                    temp.re = 0;' o! o/ [. x( N
                    temp.im = 0;
    + `& G$ P  i1 n1 K, x: @, m* Q                i1 = i;7 G5 A3 Y) W& l% ~) _/ X
                    for (j = j0; j >= 0; j--): }' f  X$ N1 y4 @  j
                    {
    2 j1 x& Z7 r% K                        /* floating date operation */* |" b8 Y" W0 I+ w% v! x0 ~
                    }
      i* L" D$ n/ s2 B( ]; {8 ^0 z
            }
    5 |+ b& }9 e+ Q. V% N4 _1 ]}5 ]' r$ _, [0 A+ s5 V( e

    ! Y! |# [  s/ n+ J0 o+ lxcorr函数代码如上,comp是复数struct, 做过长度为11、19两个矢量的测试,和octave结果完全一样
    2 b% ?1 `8 D1 p- ~6 O
    0 O1 s! n. v6 V7 |红色部分是内循环,现在其内部操作都comment out 了, j0大概是 6000。. W3 J8 U; A4 s  r8 A, P- q8 @
    现在call xcorr 100次,耗时78s.
    8 B% [0 g3 J  |, s" z
    ) l3 C; ?& c3 h% M; C) I' e如果把红色部分内循环本身完全comment out, call xcorr 1000次,耗时 <1s.
    , E( j9 M6 o; _7 O  B$ |4 b% C3 d" u
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    6#
     楼主| 发表于 2022-9-25 00:17:17 | 只看该作者
    风雨无阻 发表于 2022-9-24 23:33
    & K5 R) v1 @& p/ zMaybe Debug mode?
    & ?' M& T8 K1 x
    0 `  c$ t) L3 v* Y" E- G* R( G
    不应该,看我上面的回复。/ B3 h; i& g" H# c1 r6 O

    1 f* R0 x! m" m( O1 t3 k: K我更怀疑是 VS 社区版的问题
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2025-12-26 03:23
  • 签到天数: 1954 天

    [LV.Master]无

    7#
    发表于 2022-9-25 00:20:10 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 00:24 编辑 ! |' v) A( v9 L& H
    雷达 发表于 2022-9-24 23:54# M) ~5 J6 E, n; W1 }
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    ) I$ `; N" }3 E% D{- H/ m+ n- z% m/ c& ]
            comp temp, xtimesy;
    " v# B, [9 d( b) v! P) O

    - Z3 x( ]: J7 D5 Z4 O! R7 q这个不是这么比的吧。。。* J# F/ T% R7 Y+ b; D/ o+ S

    ! Q& a4 c1 _' u$ I% j& P' Y您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。) E3 s+ o- V5 q$ L3 y

    2 i" ^# t$ Y, v. m; K* g) e6 k; z而加上内循环,光jmp和dec指令就至少多执行了6000个,慢个几十倍不是正常的么?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    8#
     楼主| 发表于 2022-9-25 00:46:56 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 01:09 编辑
    * J! V( }$ j* o, o; J0 D5 R: v' r
    数值分析 发表于 2022-9-25 00:20
    : U! m! ~* S3 w. j7 T  E$ k这个不是这么比的吧。。。
    7 S  T! N- i) C7 ^  ]
    2 w, _3 A, I  T* o8 q! z/ t您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。

    / }. M, Y' C; ~3 o; p
    7 e6 N! n& A4 i) z( w  q+ z9 n5 n有道理。2 h6 o; R+ c$ g/ ]2 h1 I) I7 o
    所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,记得 numeric 库里有算向量内积的,我回头试试。) j3 t6 g/ `: i& R; ?' h/ N
    5 \/ D- k: Y5 U$ v7 B
    我先尝试尽量用标准库,一个小程序,不想搞得太复杂。多谢了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    9#
    发表于 2022-9-25 01:27:53 | 只看该作者
    雷达 发表于 2022-9-25 00:46) y( A- z8 g" a' I1 E
    有道理。
    ! E) {6 s6 ~# u; r. c所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,这大 ...

    ( m% z' B7 d# B8 e你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子,把循环本身翻译成机器指令loop或dec/jnz,两者速度上会差很多% z$ O0 G1 \, n+ k% L/ n
    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
    * i' f8 K. t: q' ^9 \这个不是这么比的吧。。。6 r0 |9 m% |8 ^1 k. g
    7 G3 F' H& c2 U- L1 O* `7 p2 g7 l
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    而加上内循环,光jmp和dec指令就至少多执行了6000个
      X5 o8 j4 p! y( N) e, B/ D8 e5 ^

    % [  t' z; n2 N2 @, U2 _现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果循环这样跑,花不了多少时间。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2025-12-26 03:23
  • 签到天数: 1954 天

    [LV.Master]无

    11#
    发表于 2022-9-25 02:06:44 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 02:16 编辑
    5 K1 v8 e% y' K( K+ s; S( ?
    沉宝 发表于 2022-9-25 01:483 C" c$ ]2 [! W2 T- d9 e
    现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果 ...
    2 L* k) ?8 x& R, s  g; v8 C+ I
    ) n/ s' z% X, {# ~+ k
    是的,兄台说的对。! ~) o8 k/ X7 |$ S  s: @

    / x* h  O# h( a, l& a$ ^6 u  p其实我想说的是 真正数值计算部分和代码中其他不直接计算的overhead的比值这个事儿。& b( M: R4 M. {7 \8 u

    2 z1 g: ?0 i1 ~) J: g8 X% }, B. y( f. K雷达兄构造测试用例的时候,屏蔽掉了所有计算的部分,使得剩下的都是overhead,这样run time比较的结果就显得好像不合理了。如果把计算加回去,计算部分的run time会dominate,结果就不那么离谱了。因为不好说,所以用指令数对比的方式试图直观地说明这一点。0 e4 B$ `; J1 W" c
    3 ]: H9 S* U% [- o- O" l( ^
    比如说,如果有计算,那么跑六千个循环相对于计算应该用不了多少时间。但是如果一边是什么都不做,另一边是六千个循环,那六千个循环比什么都不做慢几十倍了,就不是那么不合理了。
    8 N/ f( {% d3 V/ l+ ~
    6 G* ^4 g8 c; P" Y当然也有可能像兄台说的,是优化参数的问题,但我觉得更多地是测试用例设计的不合理。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    12#
     楼主| 发表于 2022-9-25 04:47:43 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 04:49 编辑
    7 B- w& H, k9 W9 g. L& U
    沉宝 发表于 2022-9-25 01:27
    , i0 P3 k+ h: V, C你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子 ...
    ! e2 _/ h3 s2 q' h+ P9 t

    % K- Q8 \1 R; O/ k又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差一倍,我上面这个差的太多了。
    4 S; M. l; Q/ y3 e# Z' R
    6 Q# {5 }# ?; C' K' V我已经完全懵了。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    13#
    发表于 2022-9-25 05:51:23 | 只看该作者
    雷达 发表于 2022-9-25 04:479 Y$ A- V; V* D$ F
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...

    + X) G  o0 Z( w/ W  W时间差一倍的结果可以接受。
    ; l) k. `6 U% J, a+ T! U+ O0 d
    你还是用profile工具看看吧。现在大家都主观瞎猜。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2025-12-26 03:23
  • 签到天数: 1954 天

    [LV.Master]无

    14#
    发表于 2022-9-25 14:58:59 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 15:38 编辑
    * z  o2 [7 K& L8 S* v
    雷达 发表于 2022-9-25 04:47' d) C$ `3 }# A8 o* k
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...

    ! M0 C  Z, P' V4 I' t) Y7 ]1 @7 G( F2 N" m
    1 s8 ~9 K% b( y7 `5 }; Z, g  Q0 M
    , M; _! z/ c# K, i
    能不能把这个也贴上来,看看和上一个有什么不同?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    15#
     楼主| 发表于 2022-9-26 01:30:03 | 只看该作者
    本帖最后由 雷达 于 2022-9-27 01:17 编辑 7 ~! o+ e$ h+ ^" M
    数值分析 发表于 2022-9-25 14:58- ]" d7 G9 l! [' i. l; O
    能不能把这个也贴上来,看看和上一个有什么不同?
    $ b; e3 B5 h  ~' r+ R
    理了理思路,重新做了一个测试。
    - T, y) v! z% B( u: j: ~做了两个 vector 和 两个 float *, 都长 1000003 G: K. @8 j8 {8 J5 Z
    外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
    8 d, }. M" C9 b6 J/ V7 I
    4 i# [/ e& }0 l/ s内循环试了4种方法,3 D/ G; t; S5 @0 {9 s) V7 i
    1. 直接调用 vector inner_product 247s # \8 |0 s+ M# g9 l8 S) q# Z7 Q" c
    2. vector 循环点乘累加 237s
    3 b8 ?* ]+ e0 G  m! t  h3. float * 循环点乘累加 204s
    1 m& B- [6 g) g4. 空循环 100000 次 202s
    % M# Q" O5 t+ E' o" g  p+ j' F0 v0 e4 }9 y
    不做内循环 200s
    6 o# c- i0 z& z2 M) h& @+ J* K9 o5 Q2 _/ s' t+ w" R2 n% ?
    你昨天说的对,内循环本身占比是很小的,大头在其他处理。
    / ^- q  Z  [. I9 g- ]: J2 C3 v另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。, Q) H$ @( f- `$ G( g2 \

    4 q3 ^. G/ g8 L$ p5 A; Z* f至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
    7 {0 _, Z- m" e5 x' ?  G: R3 p; ]; k! K  u* [
    (为什么下面我贴的  b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成  jj 好了,原来 方括号里的 i 是斜体标志  LOL)
    ) I* w( {: F1 K3 b) O  h$ p! d" |: |" D6 V7 s1 [9 h
            std::vector < float > vec1(N);$ F! a+ Z. h' i4 A/ s
            std::vector < float > vec2(N);
    " k6 _" Y6 e5 Q        float* b1 = new float[N];  W3 _  G. _3 u  O' i
            float* b2 = new float[N];
    + h8 H* v7 n$ P' u: G! t' r3 e
    , h: [1 A; Z' m9 v  G9 ~0 y        for (int j = 0; j < 6000; j++)' h1 _2 L6 E/ c; U  \; x' x
            {# a3 G9 y9 }# e7 I
                    std::generate(vec1.begin(), vec1.end(), []() {
    + |% w* v/ K+ b- g7 l7 P                        return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;$ f: |$ u: a$ b
                            });8 H; y) ~! Y# l3 e+ P& F% C" h
    1 _" E2 p0 q/ d6 ?% P" B# H0 h; j" \* V3 }
                    std::generate(vec2.begin(), vec2.end(), []() {
    6 N+ W1 Q7 y- h                        return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
    " N( N: F8 D' Q5 W! g% ?: {( c                        });9 \/ u2 \/ P* L& F; D+ K* t
    + R; Z; x' n, K
                    for (size_t jj = 0; jj < vec1.size(); jj++)) t1 L: M8 b) k0 h( |+ y5 p
                    {
    , N$ o3 }7 f0 V1 y: l! o9 @                        b1[jj] = vec1[jj];
    1 F, l0 l3 v( z  Y. ]                }0 f, D' s" T4 G5 z! o) U$ p
    8 |5 Z9 g  F1 n% h' ^& M
                    for (size_t jj = 0; jj < vec2.size(); jj++)8 P% Q1 i) p( [8 @3 \1 |+ T$ }  L
                    {
    0 E* u' P# ^9 C5 @  l6 p4 X                        b2[jj] = vec2[jj];
    " k/ s0 j+ z! q7 _                }8 h+ b: C# Y# r8 D! u6 M

    3 T  D$ Y* a& }  N5 ~                //Method - 1  N=100000 247s  
    4 h8 H0 w8 l8 s8 K+ `+ i) p3 ]                //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);. ^: ?% e% P9 o/ ]0 _/ u
                                    
    7 u# I$ g) H- U( r                //Method - 2  N=100000  237s( k7 _/ ?5 u" D6 H  c4 q$ O
                    /*
    $ {& l( ^" _0 `                for (int jj = 0; jj < N ; jj++)/ l& W+ R1 ~8 f' S$ R. ^4 j6 N
                    {
    7 m. p/ O) P1 ^' A- R0 M* y                        fresult += vec1[jj] * vec2[jj];
    7 m8 M+ d- M9 p* ]2 L- L                }
    / J$ x; ?/ I; h+ `) e                */# H8 ?2 ^) @- K) r1 x
                                    
    6 o! b3 l$ H' z# n3 x( R- \+ l                //Method - 3  N=100000 204s) c2 a+ |2 H3 B% u& y# a
                    /*
    4 e6 s: h1 i1 G                for (int jj = 0; jj < N; jj++)5 n1 V2 M- q7 f% v: N7 z
                    {
    1 N- H9 T$ x' _& t7 S" [                        fresult += b1[jj] * b2[jj];
    6 j. s9 |* G4 f, {8 |$ `& |                }) G: w! ^6 ~1 z7 X" \
                    */
    6 W+ s- t$ h! T9 F3 E3 k: P' N8 ]$ J  w- \
                    //Method - 4   202s
    & H6 A( H& g- W: f+ b                /*) ~% u! e( q7 Z# g+ R( ?1 A: D; Q4 Q
                    for (int jj = 0; jj < N; jj++)
    2 @0 O* G6 b- w# w/ o' V  D                {
    6 V( h0 J( v3 Q3 z3 [/ U" I                        
    $ m# m, |, h1 ~8 x6 I! A: l. U1 ~                }
    ) O% B- g- b% p; G- s                */0 [' b( D* K: E$ g( i$ Z" U
                    //comment out all methods, N=100000  202s               
      I3 d5 P6 ?, X. @7 t# x! l4 V" q        }
    & I: q5 O$ Y9 }- C$ b- x$ L4 Q( a* u+ A9 t- b% f* i( d9 w" P* Y. d- Y
            delete []b1;
    & C" y+ \) C5 R% g5 g        delete []b2;
    . ~% }% l1 ^" h( I" y  u9 s
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    16#
    发表于 2022-9-27 00:15:38 | 只看该作者
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?% b, S" O# I" l5 N" n
    ( i- `8 O% |" J: x
    你第二个试验里面的j在循环里面又重新定义了啊,你确定真的跑了6000次?
    : h' F) P7 }4 v0 n  [; S+ j
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    17#
     楼主| 发表于 2022-9-27 01:16:03 | 只看该作者
    机器猫 发表于 2022-9-27 00:15
    # o( i# ]' q+ k  P瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?
    . p) |7 T* C1 t+ {; T( J) G
    6 h+ B2 w0 ?3 T/ M! d1 |6 Q: o0 _7 c你第二个试验里面的j在循环里面又重新定义 ...
    - _4 N) ~5 V! t$ _9 M' ~, v% a
    内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL, T8 E+ Q( A# Z5 T
    & k" W$ l2 X; V" E* z) T. l, T
    不和它较劲了,瞎耽误工夫,我已经转到 ubuntu, 也准备顺便试试 avx2 向量化。
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    18#
    发表于 2022-9-27 02:06:58 | 只看该作者
    雷达 发表于 2022-9-27 01:16
    9 k+ _; c1 R  P) N; {" \  M6 U内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL+ v. t2 k7 Z% t9 i
    ! l$ Z6 o; s/ k( o; S9 u
    不和它 ...
    & J; b- G# V& l9 s# p# k

    7 g; g! Z. U' B5 w# ?$ }不过可以试试我说的register变量。前一个试验j是混在一堆其它变量里一起定义的,很有可能是在stack上,这样内存读写会更多,要是再碰上每次都需要加载cache就更慢了。
    ' r4 N: Z- f% h后面一个是在循环那里定义的,说不定编译器就把它优化成register变量了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

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

    使用道具 举报

    该用户从未签到

    20#
    发表于 2022-9-27 20:29:50 | 只看该作者
    雷达 发表于 2022-9-24 23:54
    4 H& v$ V! p' n1 Q! o5 Q7 Hvoid xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    " [* O; C- y1 N{8 z1 v8 N0 J3 \/ T( \6 G
            comp temp, xtimesy;
    . ^6 q  ?& A, W4 ~+ V6 a
    这个code里面如果Openmp没有被注释掉的话,那么temp那个变量应该是定义在循环里面,否则线程之间会存在争夺写入那个temp的风险。- p) [0 \9 m$ N* U# f  a
    内层for循环如果没有内部操作的话,编译时应该被优化掉了,和你完全注册掉整个循环是一回事。可能你的编译设置没有打开优化?
    6 c; F) t; B3 d7 U' P. x# JVS社区版没有问题,我工作用的就是社区版,设置正常的话不会比商业版差。以前游说头头用Intel Compiler,他说不想花钱,而且差不了多少,就一直用到现在。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2026-1-24 09:56 , Processed in 0.072113 second(s), 19 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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