设为首页收藏本站

爱吱声

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2022-9-24 22:54:26 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
    C++ 比 Octave 慢好多,怎么破?( k5 H0 u; u( c7 h5 @3 @
    0 G( N4 [# M! s9 F$ M
    自相关两层循环,内层循环涉及浮点数计算,试验了一下把内层循环内部全都 comment out 只留个壳子,  但空的内层循环本身就把速度拉下来了,看来问题并不在浮点计算。
    : E* O( c2 I% z+ j: M5 P
    8 F5 a+ @2 g, I速度优化问题真的很有意思啊。
    ; @& m# F- m' L, k7 z  e9 Q# j5 ~3 T+ Z$ H
    欢迎大家继续讨论

    评分

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

    查看全部评分

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

    [LV.Master]无

    沙发
    发表于 2022-9-24 23:04:16 | 只看该作者
    拉下来?拉多少?! @& V& G1 _/ Q6 `
    把代码贴上来看看?( U; }7 n7 _5 \; k

    2 N3 o( Y$ w( j0 F. h难道分支预测不准破坏流水线执行?不该啊。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    板凳
    发表于 2022-9-24 23:15:41 | 只看该作者
    会不会代码本身的缺陷阻止了自动优化?另外,硬件配置和开发环境可能也有关系。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2024-4-22 03:36
  • 签到天数: 120 天

    [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 编辑 8 |. }/ \& j/ M% m
    数值分析 发表于 2022-9-24 23:04
    1 u/ C& _! R: c( E6 B1 h$ Y拉下来?拉多少?0 K9 I: T  A( S% d3 h
    把代码贴上来看看?

    " N  _% H3 u: r; h6 ~
    * w6 z8 ]7 B+ Dvoid xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    & T3 c  {' e; `' P8 \4 Y{# t2 u9 O& h: @1 X1 M+ y
            comp temp, xtimesy;
    5 M" [7 h, i2 {5 ]1 Q        xtimesy.re = 0;
    5 K% Z% j2 z; \5 H        xtimesy.im = 0;
    + k" O! C6 G9 @. _( X7 u) s0 V        int j0 = lenB - 1;$ m/ A+ J4 V+ r# T$ o3 N
            int    i, j, i1, reali;- X7 y. r2 I1 I4 O; p  I
            if (lenA % 2 == 1)9 _( k& E6 u1 s; I4 K1 H$ c
                    reali = lenA + 1;7 Z  Y, L& A% V
            else
    ' @: B+ Q& N! d0 d# ?1 @. d/ e                reali = lenA;3 J; {* Z& r1 A. Y
            reali /= 2;
    7 w- P, r* D% T
    / y7 e+ Q/ e1 C% }" v# l6 T/ ]9 U; n        int nconv = reali + lenB;
    # ^0 a% f5 K# q& X- C        //#pragma omp parallel for, }8 a. ]' R# P4 R% g' z
            for (i = reali; i < nconv; i++)
      j" f$ B5 t# l* `# U5 j        {
    ' T3 T3 _8 E9 N                temp.re = 0;  T( m4 M; `8 U7 }9 O2 M4 `  @5 W
                    temp.im = 0;' {) O  e- T: K, W/ i% e8 r, {
                    i1 = i;
    " O4 N5 S+ ^7 o, E8 p0 Y, r8 H. O+ C) j. O                for (j = j0; j >= 0; j--): X% \) Y' Z% u7 R' z
                    {
    * n7 w2 \7 P7 @! P  r/ W                        /* floating date operation */
    5 l1 b& y% c" y                }

    3 O5 M$ c' N6 N1 Y0 D        }
    5 g2 p4 ]+ x& T  G* X}
    9 I# U: s" L# H8 W
    3 p3 G% u) t  y& f5 excorr函数代码如上,comp是复数struct, 做过长度为11、19两个矢量的测试,和octave结果完全一样
    0 d! L9 K! [7 E5 v. ]" A3 F% d/ c  ?1 O7 N2 R# u: g( ^
    红色部分是内循环,现在其内部操作都comment out 了, j0大概是 6000。
    0 V; S' B: `. @/ D% b& Q现在call xcorr 100次,耗时78s.
    8 ~+ q8 J/ E" C( w1 K8 ^% [: g  H1 y1 `" V, U# |
    如果把红色部分内循环本身完全comment out, call xcorr 1000次,耗时 <1s. 1 Z. w/ K1 p: p* h
    " f1 M0 N, Y; \+ U. d! r% _" \
    回复 支持 反对

    使用道具 举报

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

    [LV.10]大乘

    6#
     楼主| 发表于 2022-9-25 00:17:17 | 只看该作者
    风雨无阻 发表于 2022-9-24 23:337 [7 c; e9 Y& {  S; t/ }% X
    Maybe Debug mode?

    5 W- ]" C/ W- W' R6 T
    : [' T8 i6 P* O5 U. b不应该,看我上面的回复。
    4 }  ^5 i6 d. A0 i8 K6 |# {* W2 Z3 v9 F# t1 Z: O+ _
    我更怀疑是 VS 社区版的问题
    回复 支持 反对

    使用道具 举报

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

    [LV.Master]无

    7#
    发表于 2022-9-25 00:20:10 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 00:24 编辑 / A& e* A" S$ T* ^
    雷达 发表于 2022-9-24 23:54
    * J6 Y& \; V! I* g( j4 nvoid xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)+ K* v8 J# W# P
    {
    * P1 I# A8 W, X! G6 Q% Q  \( m        comp temp, xtimesy;

    1 \. Z  F. M& S6 @- _
    2 k( Q! U% @, t3 r9 K这个不是这么比的吧。。。& l/ b7 s& B& ?! U0 r/ X
    " {* y: i; X  ]2 a
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    ) D' k- a6 a* b( C1 _. o, n
    / m' j9 f! q8 D# W. w2 Q7 D而加上内循环,光jmp和dec指令就至少多执行了6000个,慢个几十倍不是正常的么?
    回复 支持 反对

    使用道具 举报

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

    [LV.10]大乘

    8#
     楼主| 发表于 2022-9-25 00:46:56 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 01:09 编辑 0 N/ h3 S( [3 j/ S2 m- U, z! c
    数值分析 发表于 2022-9-25 00:200 [4 [. b" X. M3 b' Q
    这个不是这么比的吧。。。3 A+ D/ c8 ^$ |) o, I& e, \" z( U
    : g. G; u, c: Q! s3 v1 Y
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。

    2 N' i% K/ Z  \2 K( q
    ; b8 N3 R2 ?- u8 Z& h2 s5 [0 D5 Z1 M有道理。
    7 f/ y+ E/ K% L3 u. w" _所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,记得 numeric 库里有算向量内积的,我回头试试。6 x0 [6 _8 B& _5 ?1 e
    , j6 ^2 I1 k  _& A
    我先尝试尽量用标准库,一个小程序,不想搞得太复杂。多谢了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    9#
    发表于 2022-9-25 01:27:53 | 只看该作者
    雷达 发表于 2022-9-25 00:46, {  f( G2 s* _, E9 p
    有道理。( P. n4 t8 f1 z3 I6 X
    所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,这大 ...

    - `7 w2 ^( H. c" R$ _) W6 a/ r, V" C# q你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子,把循环本身翻译成机器指令loop或dec/jnz,两者速度上会差很多) u5 O9 T# X% i. @- z9 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
    0 O6 W8 ]  j, q' Y  Y4 T这个不是这么比的吧。。。3 i3 y; V2 V$ G8 \. [6 h

    1 C  l8 p6 z, c% A0 B您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    而加上内循环,光jmp和dec指令就至少多执行了6000个
    ; x9 y8 K1 K' X$ Q
    % k2 w6 l& G& e3 w# [
    现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果循环这样跑,花不了多少时间。
    回复 支持 反对

    使用道具 举报

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

    [LV.Master]无

    11#
    发表于 2022-9-25 02:06:44 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 02:16 编辑
    $ b3 s0 }9 M: g) x1 L1 p
    沉宝 发表于 2022-9-25 01:488 h& g; X8 U) Z. \, g6 b0 i
    现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果 ...

    , \2 R' |. i& m% \1 V; C2 Y% I( V4 Q4 d$ Z# X/ p3 `( q6 k5 H( \. E
    是的,兄台说的对。) K$ [% z+ W* V% T

    / u2 k8 T" j& q3 r0 y& z+ f其实我想说的是 真正数值计算部分和代码中其他不直接计算的overhead的比值这个事儿。
    , @3 b9 R! o2 ~$ n7 a/ D
    $ _2 z9 F4 v' Q/ c" {+ b雷达兄构造测试用例的时候,屏蔽掉了所有计算的部分,使得剩下的都是overhead,这样run time比较的结果就显得好像不合理了。如果把计算加回去,计算部分的run time会dominate,结果就不那么离谱了。因为不好说,所以用指令数对比的方式试图直观地说明这一点。
    7 J4 A9 \% d& ~$ S- x& ?" {5 ?5 a, n  W
    比如说,如果有计算,那么跑六千个循环相对于计算应该用不了多少时间。但是如果一边是什么都不做,另一边是六千个循环,那六千个循环比什么都不做慢几十倍了,就不是那么不合理了。. @- Z# V3 O9 L( ?1 L: L
    7 z) E  m- i) g8 Y# O3 w1 E
    当然也有可能像兄台说的,是优化参数的问题,但我觉得更多地是测试用例设计的不合理。
    回复 支持 反对

    使用道具 举报

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

    [LV.10]大乘

    12#
     楼主| 发表于 2022-9-25 04:47:43 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 04:49 编辑
    3 ?% _8 B. D. i
    沉宝 发表于 2022-9-25 01:27! U$ \1 g: n- j( j, ^2 E7 ?
    你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子 ...
    , L; h2 `2 W( ], Z& `

    , w/ a$ @0 j, R7 K9 o又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差一倍,我上面这个差的太多了。
    . s6 T4 |2 f/ U! L8 n% V2 D: h4 o* L" A6 N+ l6 P, m4 T
    我已经完全懵了。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    13#
    发表于 2022-9-25 05:51:23 | 只看该作者
    雷达 发表于 2022-9-25 04:47
    + F# C6 x& t1 g8 t6 f1 a+ ]; v又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...

    / h7 S4 R  @: {, m# L时间差一倍的结果可以接受。
    ( g* u7 N* H  J, \* R4 t( a
    . V6 P& W7 |: i& Q* b你还是用profile工具看看吧。现在大家都主观瞎猜。
    回复 支持 反对

    使用道具 举报

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

    [LV.Master]无

    14#
    发表于 2022-9-25 14:58:59 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 15:38 编辑 2 a* b  p& v- |7 m: d
    雷达 发表于 2022-9-25 04:47
    ; H3 c4 K$ G: g' n* Z又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...
    6 n# k9 y/ i) z4 S8 i" C, l; q

    8 E4 A& y: @5 S( ~- _' B3 r
    ( B# X' N# u6 K: ?: m$ _5 `/ W  M1 c9 l
    能不能把这个也贴上来,看看和上一个有什么不同?
    回复 支持 反对

    使用道具 举报

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

    [LV.10]大乘

    15#
     楼主| 发表于 2022-9-26 01:30:03 | 只看该作者
    本帖最后由 雷达 于 2022-9-27 01:17 编辑
    ( L9 K* V' `. J! R& K
    数值分析 发表于 2022-9-25 14:58( U5 _* ]4 e' ^) F& a
    能不能把这个也贴上来,看看和上一个有什么不同?
    % y$ ]! I9 K) o' p) X
    理了理思路,重新做了一个测试。
    $ G: t6 T  a9 R6 P: x做了两个 vector 和 两个 float *, 都长 100000
    . d. f9 G9 w7 [, \3 S0 z5 R外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
    ' c$ M# E' ~& m% t
    * `! i. x' G. o- E1 x内循环试了4种方法,+ G/ z0 v3 a- h
    1. 直接调用 vector inner_product 247s
    ' V3 I! s; t& M8 _: Q7 ^2. vector 循环点乘累加 237s
    - a3 e* F% O; X) n+ G7 [; x! [6 g4 \3. float * 循环点乘累加 204s
    ( U" z. I0 s- }) K4. 空循环 100000 次 202s9 z" H9 \# J, x- b" [& F0 q1 W

    , f2 p) Q) P0 ]. {+ Z/ f% F$ t' N不做内循环 200s
    0 A& n7 J4 }1 n. e! g2 H2 ^4 x0 ?; ?5 q' D7 t3 H" h
    你昨天说的对,内循环本身占比是很小的,大头在其他处理。4 y7 \4 X0 F( q! |( B7 T5 r
    另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
    7 N; m0 [* n9 K- [' g! f3 s& Z# {/ l/ X
    至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)+ z4 ^/ D' d% x

    6 ^; w  j; S1 k4 p1 }. }; a$ l(为什么下面我贴的  b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成  jj 好了,原来 方括号里的 i 是斜体标志  LOL)& P) Q/ K: P6 ?: p6 Y# F% Z, P
    0 U+ {% ~% T1 b; O5 L" {% p% O
            std::vector < float > vec1(N);
    8 _, C7 ^0 K4 F* \7 X' a; m) e        std::vector < float > vec2(N);
    ; b9 V4 t) W6 E        float* b1 = new float[N];: z+ W3 W  G+ e8 g
            float* b2 = new float[N];. ^3 x. a0 p$ N* K! A% w
    / k7 {/ t0 ]( {% c# o
            for (int j = 0; j < 6000; j++)# d" Y. k5 Q# f  T; \
            {
    , [- b7 _$ q. J, Y* {+ o& T                std::generate(vec1.begin(), vec1.end(), []() {
    $ x- [/ h  x& w5 N6 F& f  J1 @' S- ~                        return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;5 n2 X, x, i0 Q, o% C3 }6 E+ g
                            });  n# b( J- ^1 b0 d% J# i
      J3 q' C  p2 Y$ `
                    std::generate(vec2.begin(), vec2.end(), []() {" C  J' F) |+ p/ [. w2 k$ N( `
                            return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
    3 p* }# y: p+ X, u7 V- l" [  j: S                        });, l3 E" Y- L" T3 l, f3 I: Y
    9 {2 L# i" O$ y0 q, F' B
                    for (size_t jj = 0; jj < vec1.size(); jj++)8 s5 w6 v5 x6 S2 J
                    {
    , |: y# O/ z/ s# W8 R& K$ A                        b1[jj] = vec1[jj];
    ; D" l: {- y: T0 Z7 ^2 [                }
    - `) k8 V8 |+ e6 O" q$ x, G" @1 C+ E+ [0 X' K/ P. ?8 q0 z
                    for (size_t jj = 0; jj < vec2.size(); jj++)$ o; n$ c5 J+ X% R) q5 ^# N/ s- t( @
                    {
    4 U( w* ]6 o5 O+ L0 D                        b2[jj] = vec2[jj];+ v" i. @1 m, ^2 H. j2 d9 @0 u
                    }2 x* N) u. `' e) k3 q
    1 k/ e3 ~9 Y/ o  R- h7 E) n3 w) @
                    //Method - 1  N=100000 247s  2 l# N: t* U7 O# K" y
                    //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);- g6 `# T; h% v) d& {0 C
                                    
    0 _" R8 F6 Z( p6 b# C1 u                //Method - 2  N=100000  237s9 i' w8 _: ?. _5 |5 _/ U
                    /** ?5 }3 N) c. v
                    for (int jj = 0; jj < N ; jj++)
    / y1 @- S7 |% r8 t! i                {' J" T; c/ G" F' U8 @8 T3 m5 V
                            fresult += vec1[jj] * vec2[jj];
    6 B& d# N& X! _/ X5 F( v                }
    0 ?& N! j7 n, ?* ~" G; k( o; R                */
    : V& K) r3 Z) b" m# C                                
    " b9 v! ~1 z( g8 `: n                //Method - 3  N=100000 204s
    0 @- n+ s* r* h6 ?                /*6 q' v. n& P- R: h- o  x
                    for (int jj = 0; jj < N; jj++)
    0 f# {% O. g4 B/ T                {
    8 W. j; }( p5 A2 ], h8 D  q9 Z                        fresult += b1[jj] * b2[jj];
    + t9 t* N$ B( J% K5 ?0 r                }
    9 u4 h. i6 Y, a: d3 j                */8 O* h% G0 q3 b8 A, N' K
    : U, ]/ b: I9 W1 \4 C5 `/ T
                    //Method - 4   202s
    5 H& o6 I$ @2 p0 N                /*
    " ]: i. n; b7 A- u                for (int jj = 0; jj < N; jj++)
    1 w; h, t  g) R7 y% ]5 R                {
    , b4 l5 o! v% F" O! G                        ! u  E/ q+ M3 E. m/ {8 H1 _7 {
                    }: ?! U" e6 M7 ?0 J/ }
                    */
    , }* W  l% n0 r! a1 w% F9 J# n                //comment out all methods, N=100000  202s                ! d2 H5 G; p/ |. I
            }$ T$ L# R$ \5 E

    ( [, [: ^# y. I8 l$ K% O6 i% ^        delete []b1;
    % C& p+ d; o7 @/ C# @        delete []b2;
    $ ]$ P+ \/ z8 |  U6 M
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    16#
    发表于 2022-9-27 00:15:38 | 只看该作者
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?
    . K) y- m: c/ M8 I
    ; i; m( z* S! B% `" P; P! F你第二个试验里面的j在循环里面又重新定义了啊,你确定真的跑了6000次?9 r8 ]9 q/ N& `
    回复 支持 反对

    使用道具 举报

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

    [LV.10]大乘

    17#
     楼主| 发表于 2022-9-27 01:16:03 | 只看该作者
    机器猫 发表于 2022-9-27 00:150 a( G2 [9 d7 L& C. ^6 w. s% N% U
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?
    ! N7 {4 }% I% }+ N  L7 R6 ]3 y2 Y, a, a9 `& s
    你第二个试验里面的j在循环里面又重新定义 ...
    . y1 w8 b1 J- }7 T2 U  F  v( K5 s/ Z
    内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL7 s' M3 F' k' Z; Y# p

    ; g  Y( q0 Y, U不和它较劲了,瞎耽误工夫,我已经转到 ubuntu, 也准备顺便试试 avx2 向量化。
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    18#
    发表于 2022-9-27 02:06:58 | 只看该作者
    雷达 发表于 2022-9-27 01:16
    6 w3 K# Y7 j$ \7 R- R; Z; [( a( U内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL+ t$ X# d+ M4 ]& ]! e+ _  A

    - V1 y0 {6 W$ \" u不和它 ...

      v! i- j7 I/ [3 |1 b+ q* q. h: B6 N( F
    不过可以试试我说的register变量。前一个试验j是混在一堆其它变量里一起定义的,很有可能是在stack上,这样内存读写会更多,要是再碰上每次都需要加载cache就更慢了。1 B9 G( k# @$ t" m* H7 c; [" I
    后面一个是在循环那里定义的,说不定编译器就把它优化成register变量了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

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

    使用道具 举报

    该用户从未签到

    20#
    发表于 2022-9-27 20:29:50 | 只看该作者
    雷达 发表于 2022-9-24 23:54' l9 @; ]3 B7 @1 w  z: k0 w
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    7 Z  U$ d( i; s3 f{
    & U" x2 P; y" L        comp temp, xtimesy;
    8 m. r  |+ c0 j5 m' x0 n  r
    这个code里面如果Openmp没有被注释掉的话,那么temp那个变量应该是定义在循环里面,否则线程之间会存在争夺写入那个temp的风险。
    - p9 y  w  g3 G0 p% b( [5 k/ E* Y内层for循环如果没有内部操作的话,编译时应该被优化掉了,和你完全注册掉整个循环是一回事。可能你的编译设置没有打开优化?
    ' f7 Y" A+ X3 h9 D3 c0 _VS社区版没有问题,我工作用的就是社区版,设置正常的话不会比商业版差。以前游说头头用Intel Compiler,他说不想花钱,而且差不了多少,就一直用到现在。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2025-5-11 07:58 , Processed in 0.046947 second(s), 19 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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