设为首页收藏本站

爱吱声

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

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

[复制链接]
  • TA的每日心情
    怒
    2025-9-22 22:19
  • 签到天数: 1183 天

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2022-9-24 22:54:26 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
    C++ 比 Octave 慢好多,怎么破?4 Q5 i% O# y" @& P/ i
    7 H  {9 {; Q% K  U+ x
    自相关两层循环,内层循环涉及浮点数计算,试验了一下把内层循环内部全都 comment out 只留个壳子,  但空的内层循环本身就把速度拉下来了,看来问题并不在浮点计算。
    * ~/ |4 x( e( K, \5 V: T
    1 ?- p/ S, M6 f# A速度优化问题真的很有意思啊。
    ! b# X$ N# H7 }0 c. h# Y' ]: O& W  D& F- H6 w; e9 {# K
    欢迎大家继续讨论

    评分

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

    查看全部评分

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

    [LV.Master]无

    沙发
    发表于 2022-9-24 23:04:16 | 只看该作者
    拉下来?拉多少?
    7 Z& O! t  O3 o+ k. D把代码贴上来看看?3 C; X) s+ n' O
      z  E, f) a# u+ p0 s. L" R
    难道分支预测不准破坏流水线执行?不该啊。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    板凳
    发表于 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 编辑
    & `. i% E1 i, g* c9 l$ ~1 s
    数值分析 发表于 2022-9-24 23:04
    1 x8 a9 V4 E- S/ Z- a; [拉下来?拉多少?. p) o) t5 N, T2 b( {/ m
    把代码贴上来看看?
    7 K! q, ?7 V+ G
    ( }+ U. n. @9 [' E7 s$ g
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)" X7 s+ Q. R/ E# d% E6 p  z' a8 j
    {
    # N+ `4 f" h0 v4 q        comp temp, xtimesy;0 I$ X" E0 |! W8 f; W8 m- J
            xtimesy.re = 0;( w2 p5 l. k& B( P! W
            xtimesy.im = 0;
      l4 C# b1 |- D2 V: C8 Z        int j0 = lenB - 1;
    7 R# A$ r! a5 H3 a, w9 ]        int    i, j, i1, reali;2 w, S. f; }3 Q
            if (lenA % 2 == 1)
    " }5 h2 @. r7 d1 N+ y                reali = lenA + 1;5 G; w, X' q/ V  S. A0 |- M, i
            else$ A, S6 e# D  y- o1 R7 \6 z& ?
                    reali = lenA;# T1 A( n* b! E% N  a
            reali /= 2;$ `. e' H* j2 h/ S, o4 \* g, N; v- e
    4 B; H$ Y- c: \8 d5 A
            int nconv = reali + lenB;. ^' K- o4 u  w/ g
            //#pragma omp parallel for
    9 B: l% v( E, e4 a        for (i = reali; i < nconv; i++)
    $ U, f3 B/ t5 f$ ^2 Q5 [* o        {: y% B! O0 q! E/ Y; ^
                    temp.re = 0;4 [7 [3 w  s5 o: t; T
                    temp.im = 0;/ A- F7 h# ?1 h, B/ N& m
                    i1 = i;& f- N' d3 C9 K  N8 G# r/ D
                    for (j = j0; j >= 0; j--)6 g# G7 \8 ^" c8 Q( f4 w: Y
                    {0 d# d7 G/ \" z- f0 t% ?6 r
                            /* floating date operation */7 Y6 X- h) Y2 |* c  i/ e
                    }
    1 o3 y% @1 v5 b1 ~( t
            }
    . B6 T2 x: q: }3 {/ B}& B9 H% r: z# `3 O6 O8 W

    , M5 ?( d0 U# j) N5 W+ d2 d7 ~- vxcorr函数代码如上,comp是复数struct, 做过长度为11、19两个矢量的测试,和octave结果完全一样: E( Q2 a: ^4 N8 K2 I; ]3 s
    & ^; x7 a! f* ^
    红色部分是内循环,现在其内部操作都comment out 了, j0大概是 6000。7 c2 }: |; }- S" }7 D# p
    现在call xcorr 100次,耗时78s.* C% M9 c! f/ f+ v  S0 Q

    6 Y: h/ M3 J! e( S7 B# n! s如果把红色部分内循环本身完全comment out, call xcorr 1000次,耗时 <1s.
    ( a. b9 H1 a6 w' g2 `
    / a, x8 r5 P; V
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    怒
    2025-9-22 22:19
  • 签到天数: 1183 天

    [LV.10]大乘

    6#
     楼主| 发表于 2022-9-25 00:17:17 | 只看该作者
    风雨无阻 发表于 2022-9-24 23:338 ]# k, T9 {1 T6 b: _6 r
    Maybe Debug mode?

    - R. u7 ?' k, m- L, U, q
    - p! K# z. @7 ?. [不应该,看我上面的回复。
    " N# Y; l1 s  G8 M' F2 I
    3 V; }/ m9 Z% x; z* D% r; v我更怀疑是 VS 社区版的问题
    回复 支持 反对

    使用道具 举报

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

    [LV.Master]无

    7#
    发表于 2022-9-25 00:20:10 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 00:24 编辑 # ]6 p3 D6 p# o. z: m( P  h+ }' d; a
    雷达 发表于 2022-9-24 23:54
    % Q0 Y- W2 b/ O7 e  e" e' nvoid xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)3 H% M2 q1 q* t7 U
    {( x" G& n1 g7 E' _
            comp temp, xtimesy;

    ! d% ~# Y' ]8 V, j
    4 ?- }. c" A! C2 u( f1 `这个不是这么比的吧。。。+ Z# P9 u* p$ ]3 n4 d0 z4 B- M
    ! r0 Z# Z- A- J3 F! c# y4 \
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    4 W* a' m8 w9 I9 ]; {1 x$ ?1 z& z$ c9 V2 m  m% J
    而加上内循环,光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* C$ n$ o4 s3 `7 c/ o
    数值分析 发表于 2022-9-25 00:20
    3 L# g* |% K9 _, K0 R; c这个不是这么比的吧。。。
    ! O7 {/ X+ ]4 {, S: c! ^: l, g2 l: f0 r  q/ g1 l- |" _( y* u" y
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    $ U3 |- k2 o3 M
    7 ]# `' a! K7 |0 M8 c! L
    有道理。+ x) z. }0 }! a6 a$ i
    所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,记得 numeric 库里有算向量内积的,我回头试试。
    8 M5 P% Z/ W- w2 U, G8 l6 i6 o
    1 l' \4 P+ T+ F, w. Q( A我先尝试尽量用标准库,一个小程序,不想搞得太复杂。多谢了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    9#
    发表于 2022-9-25 01:27:53 | 只看该作者
    雷达 发表于 2022-9-25 00:46$ J/ j6 F5 F9 \2 ]
    有道理。$ \% {/ D/ `" L* v' ?. s. j
    所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,这大 ...
      G- _! |% W" I: r; R6 C( r' [7 |2 B. o
    你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子,把循环本身翻译成机器指令loop或dec/jnz,两者速度上会差很多6 o% d  L5 p7 f6 d
    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
    . v5 |( b+ m5 u: M3 W7 W9 U这个不是这么比的吧。。。  W1 _0 B9 `# c1 `- Q

    * w. _4 C' V# I; D! o, p您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    而加上内循环,光jmp和dec指令就至少多执行了6000个
    / I  s; w( a, o' a# v$ w, W
    ! `+ b" b; L, \, R+ l+ b0 L
    现在的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 编辑   K, ?1 k' Y3 O2 a
    沉宝 发表于 2022-9-25 01:487 S( e& f2 N2 D9 t; r
    现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果 ...
    ( r9 K8 I5 |& M( ?# B. h
    / X4 b+ t# |- F4 a
    是的,兄台说的对。
    - i) B: b0 a" q
    5 Z7 z: `" |! H  G) T# ~其实我想说的是 真正数值计算部分和代码中其他不直接计算的overhead的比值这个事儿。
    2 ~! `1 Q: f+ ?# [! Y# H+ N, n
    / T% B+ c) ?! ^! W  ^' m雷达兄构造测试用例的时候,屏蔽掉了所有计算的部分,使得剩下的都是overhead,这样run time比较的结果就显得好像不合理了。如果把计算加回去,计算部分的run time会dominate,结果就不那么离谱了。因为不好说,所以用指令数对比的方式试图直观地说明这一点。8 t; A* v& G: E8 L
    5 m/ `7 v3 @9 M) r, R+ \$ V9 V7 `0 P
    比如说,如果有计算,那么跑六千个循环相对于计算应该用不了多少时间。但是如果一边是什么都不做,另一边是六千个循环,那六千个循环比什么都不做慢几十倍了,就不是那么不合理了。
    ' ]0 ~4 t- G( J; X5 d
    , r2 j2 L# t3 y" h当然也有可能像兄台说的,是优化参数的问题,但我觉得更多地是测试用例设计的不合理。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    怒
    2025-9-22 22:19
  • 签到天数: 1183 天

    [LV.10]大乘

    12#
     楼主| 发表于 2022-9-25 04:47:43 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 04:49 编辑 4 y  R5 X- |" j
    沉宝 发表于 2022-9-25 01:27$ f2 S- p& b6 j& Q, e/ v
    你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子 ...

    7 c/ `; {4 I  D5 K6 }, Q6 B
    ' h, h' c1 L9 w6 c+ e4 Z6 S又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差一倍,我上面这个差的太多了。7 K  a& ]% i: l3 i( F

    % d2 R4 E3 ]$ h- `& H* S6 u我已经完全懵了。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    13#
    发表于 2022-9-25 05:51:23 | 只看该作者
    雷达 发表于 2022-9-25 04:47* M% K' f9 c0 Z5 x
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...
    4 {. Z" F+ b6 r% {9 Q4 @
    时间差一倍的结果可以接受。
    3 d" D/ o6 V; C3 E8 F
    * v6 @. r5 E& X! \' A1 Z你还是用profile工具看看吧。现在大家都主观瞎猜。
    回复 支持 反对

    使用道具 举报

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

    [LV.Master]无

    14#
    发表于 2022-9-25 14:58:59 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 15:38 编辑
      ?; w" t: H' B0 H: g: M% b
    雷达 发表于 2022-9-25 04:47
    7 `; P# `; p4 H7 {又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...

    1 V! [5 d7 ~" k( m" S5 y$ I/ Z4 @2 X- `: N" ?

    / H1 }" p; ]+ z% f' e5 c
    ) S6 P4 B* m) Q8 Q) @$ Y0 m$ [/ s/ W能不能把这个也贴上来,看看和上一个有什么不同?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    怒
    2025-9-22 22:19
  • 签到天数: 1183 天

    [LV.10]大乘

    15#
     楼主| 发表于 2022-9-26 01:30:03 | 只看该作者
    本帖最后由 雷达 于 2022-9-27 01:17 编辑 + P4 L6 N+ {2 |+ t; U9 q7 C
    数值分析 发表于 2022-9-25 14:58
    ) g4 s+ W$ a- Q; X6 m能不能把这个也贴上来,看看和上一个有什么不同?

    ' p+ }  z6 v, k* u理了理思路,重新做了一个测试。
    4 R& X# \' G0 k* N$ S做了两个 vector 和 两个 float *, 都长 100000# T  m* V2 B: [! w( P/ L  R) E
    外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
    4 \' h1 P. J" a& W
    ' \7 V0 N8 z, f+ k- f2 k  p3 `$ E内循环试了4种方法,  a8 _, ]1 b! i, E
    1. 直接调用 vector inner_product 247s . A( N0 P$ q7 _9 ~  w
    2. vector 循环点乘累加 237s
    8 x& U( A6 R  A3. float * 循环点乘累加 204s/ D, L/ o/ U8 e. f& J+ }
    4. 空循环 100000 次 202s: g" a: S8 Y8 ]+ b
    : a& S0 h0 w& D+ @6 Z
    不做内循环 200s
    * W; R1 _4 o0 T. A
    # W$ ?4 k; D( r  i  |$ F, ?3 [& e你昨天说的对,内循环本身占比是很小的,大头在其他处理。
    / s) c4 {% a8 }2 J! k另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
    7 F9 \: `8 b5 h% U+ Z# l
    * `. q% K! c1 {/ g# Y+ y% v( }至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)* y  `" r. b* P
    4 R, ^: V  h6 p- ^! D
    (为什么下面我贴的  b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成  jj 好了,原来 方括号里的 i 是斜体标志  LOL)
    * s- V. p' a! P- y* e' {7 e
    ) L+ [/ I( i8 |; @
            std::vector < float > vec1(N);$ _# ?0 M% M2 }' q2 f# ~
            std::vector < float > vec2(N);  w4 b% y0 D% d& _
            float* b1 = new float[N];
    $ I  m# r: @% K% I/ U- E( V        float* b2 = new float[N];; @3 p2 u) G6 M# I# v8 A% R
    2 p% I- N9 Z  g$ E' U
            for (int j = 0; j < 6000; j++). P9 A8 E* |9 C! J
            {
    : H3 K; Y4 [! |7 ]; Q                std::generate(vec1.begin(), vec1.end(), []() {
    5 H' |+ f8 w. f8 K, w/ o                        return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;+ k' O+ c/ H# Q+ p6 B. v4 F
                            });
    # d. n" V5 u# a9 j. a% T# j2 y
    2 Q* p4 O  t3 z2 y9 e4 H! L                std::generate(vec2.begin(), vec2.end(), []() {
    ( ]; [- N& }, F, S% P/ y- }                        return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;! D, ~: k4 a# Q& o
                            });
    6 ]; @5 l( n# B3 @3 P
    " A  g! C# R1 s+ R. r                for (size_t jj = 0; jj < vec1.size(); jj++)
    7 Y/ p( `8 A3 t! o/ P  O( K7 f                {' |/ o! h( x+ }$ A9 J3 L- I
                            b1[jj] = vec1[jj];5 W2 N6 j7 f! b6 Y0 I7 [
                    }% \" q. \8 [$ Q

    6 {& c/ o( r9 a4 a2 K& p6 y                for (size_t jj = 0; jj < vec2.size(); jj++)6 n7 {2 S  J! n3 }. |! u/ N6 Z' E
                    {( e& M* T! e' g0 M1 ?* c
                            b2[jj] = vec2[jj];
    ; A0 O! W+ D1 N$ n* v0 w% P7 D                }
    2 W5 y% O  b4 Q, _' Y& @5 o9 ]4 R1 X6 N4 F1 B
                    //Method - 1  N=100000 247s  , j1 P, U: A; [& e/ Y
                    //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);7 s6 o$ ?, \) K1 }. Z& W1 ~
                                    
    3 [' l0 @, u. i% r& |3 H2 z/ c                //Method - 2  N=100000  237s( g( |9 S( C9 H9 p' _
                    /*
    * p& C0 R1 d2 r4 l0 ?' A9 y+ J                for (int jj = 0; jj < N ; jj++)! G6 b( Z% \/ ^, B
                    {" c% \/ |: s* E4 `
                            fresult += vec1[jj] * vec2[jj];
    ( p  H. m& I, p% A9 }# m                }
    2 g' \% D8 h2 _6 @5 k6 }                */
    6 Y: B1 ]! y6 \' z                                - z3 R4 h! C. _  ^* a7 {) j5 K% \
                    //Method - 3  N=100000 204s" i) x! f9 a3 {7 O; O( i" ]
                    /*
    $ U8 }/ b4 D! P- q" L# f% A& r                for (int jj = 0; jj < N; jj++)
    & G8 _$ u4 B- c' W                {
    1 B, X# q. e/ m5 b, k' O7 u# b' e( _                        fresult += b1[jj] * b2[jj];9 z  O0 Y& R$ J, ?7 X5 l7 j: H
                    }
    6 y% A+ Y3 M/ f/ y7 x% l                */
    0 e1 {% R1 W2 \% Z; \
    % @, z& V  q9 g* _                //Method - 4   202s
    - u. O1 a! k3 q  [6 z, W0 F                /*
    $ Q8 U3 ]7 n$ ^5 ^( y5 |/ v; m                for (int jj = 0; jj < N; jj++)
    ! e7 e. R7 \; o! r: |7 r* l                {
    ) ~9 m/ z' ^. A( r  m9 }                        
    2 |9 n8 b, \- S7 n+ B5 B                }# A% x) U4 S* @& F- n' J
                    */. \; J# Z2 B# ~" d* n
                    //comment out all methods, N=100000  202s               
    ! M: e& C2 E$ m1 ?& A        }/ t; K' L4 m, m7 j% n

    1 ?( h, X& ^8 l, F5 t: L        delete []b1;  f, E9 U5 }7 A+ R% _
            delete []b2;
    3 h! Q: x2 w! j/ [) N
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    16#
    发表于 2022-9-27 00:15:38 | 只看该作者
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?
    0 F8 k; L) Z9 r) y6 w& Q: Y6 k6 A1 j  ?4 P3 f+ @
    你第二个试验里面的j在循环里面又重新定义了啊,你确定真的跑了6000次?$ z. R( K# C3 ^  ^- @2 {4 O2 w
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    怒
    2025-9-22 22:19
  • 签到天数: 1183 天

    [LV.10]大乘

    17#
     楼主| 发表于 2022-9-27 01:16:03 | 只看该作者
    机器猫 发表于 2022-9-27 00:15: B' k- P! J; T6 X4 r
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?& i4 _- r3 m8 O( \
    ' K, E6 n# {$ \
    你第二个试验里面的j在循环里面又重新定义 ...

    $ I# w' |' m* G. d2 z7 B) w内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL
    5 {$ P$ b# F! n
    . [4 H3 A2 E7 ^8 p不和它较劲了,瞎耽误工夫,我已经转到 ubuntu, 也准备顺便试试 avx2 向量化。
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    18#
    发表于 2022-9-27 02:06:58 | 只看该作者
    雷达 发表于 2022-9-27 01:16$ N* {  j$ ~* c8 p) I. U( ^
    内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL
    * P8 Z' U5 k) J8 |* `  C. K' V/ c6 G! c" ]( Y6 e. v, t' S* k; L
    不和它 ...

    : v7 b8 Z* G; m& Q: ^* w( w2 @8 |- ?% J: j
    不过可以试试我说的register变量。前一个试验j是混在一堆其它变量里一起定义的,很有可能是在stack上,这样内存读写会更多,要是再碰上每次都需要加载cache就更慢了。
    4 ^; Q- N) k5 N2 D后面一个是在循环那里定义的,说不定编译器就把它优化成register变量了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

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

    使用道具 举报

    该用户从未签到

    20#
    发表于 2022-9-27 20:29:50 | 只看该作者
    雷达 发表于 2022-9-24 23:54' X  ]1 N# D3 q# r- a: G" u8 u1 \2 H) y
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    ! F0 [$ N2 j9 @" ?$ ^{* Y5 G0 T! V$ I% @# T, J9 F
            comp temp, xtimesy;
    & A' t% ^# x; A7 j
    这个code里面如果Openmp没有被注释掉的话,那么temp那个变量应该是定义在循环里面,否则线程之间会存在争夺写入那个temp的风险。
    , z  b4 \& X" a内层for循环如果没有内部操作的话,编译时应该被优化掉了,和你完全注册掉整个循环是一回事。可能你的编译设置没有打开优化?5 p7 V) S1 o. q# }8 [( M
    VS社区版没有问题,我工作用的就是社区版,设置正常的话不会比商业版差。以前游说头头用Intel Compiler,他说不想花钱,而且差不了多少,就一直用到现在。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2026-10-10 16:03 , Processed in 0.104346 second(s), 19 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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