设为首页收藏本站

爱吱声

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

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2022-9-24 22:54:26 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
    C++ 比 Octave 慢好多,怎么破?# S) j' G/ I1 f. O. u1 K. J

      j4 ]$ e; h+ B" U自相关两层循环,内层循环涉及浮点数计算,试验了一下把内层循环内部全都 comment out 只留个壳子,  但空的内层循环本身就把速度拉下来了,看来问题并不在浮点计算。6 }- T+ X( P% Q) u# D" A0 z' j8 n
    - j6 r+ w, A  L+ L  B7 G7 V* y
    速度优化问题真的很有意思啊。
    - ]6 B6 z5 C  M5 b( A. b, B
    ' ~; P4 a, Y2 z欢迎大家继续讨论

    评分

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

    查看全部评分

  • TA的每日心情
    开心
    4 天前
  • 签到天数: 1947 天

    [LV.Master]无

    沙发
    发表于 2022-9-24 23:04:16 | 只看该作者
    拉下来?拉多少?
    * ^% E  b  {7 @/ ~' T把代码贴上来看看?$ I! L0 |% q  }3 A7 M# }6 O8 V6 K
    5 l  o5 ^& k! _9 J- g
    难道分支预测不准破坏流水线执行?不该啊。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    板凳
    发表于 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 编辑 % R: R1 o) ?2 L) @4 I
    数值分析 发表于 2022-9-24 23:04. b% S- w2 D. K1 w
    拉下来?拉多少?
    ) b' t2 W3 D+ u4 E0 S: R5 q把代码贴上来看看?
    # X. S( ^' x5 ?& u

    1 }' j3 D+ E  [) {6 B# ]5 zvoid xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    ! N- c! s; ~* n2 `- Y; R2 M7 w& R{6 j( g; r2 D2 W! s2 u( T
            comp temp, xtimesy;- Y* B* s5 m4 c* a/ f6 n# G
            xtimesy.re = 0;2 X$ L+ G0 ?+ ~7 H- _- z" d) g
            xtimesy.im = 0;0 C! q+ M) K/ j5 ~9 h: V  K/ Z8 T% C
            int j0 = lenB - 1;
    5 }) c# S5 O8 t; r        int    i, j, i1, reali;; Z# [; \6 A, P/ c& E6 e
            if (lenA % 2 == 1)
    5 c# R+ P% k9 V                reali = lenA + 1;5 {0 S5 O' a7 }# t0 }) L
            else
    7 t# ]1 K! B0 S( K3 `: S: M! U- M                reali = lenA;( `% S* p6 m0 |" V9 W: M0 Z3 b6 S
            reali /= 2;. b/ o  y. A! ~8 N; m3 A$ Y

    . `! }7 L! c9 c4 S2 @5 w& K        int nconv = reali + lenB;
    . e; z6 V7 Z- ]* H( w        //#pragma omp parallel for
    6 S6 V, h2 m# b! Y# M+ P# d        for (i = reali; i < nconv; i++)' t7 B/ u6 {/ Y
            {
    9 L  i$ u/ E: L$ P* q                temp.re = 0;
    $ V3 a3 B0 t% c  G$ O( E4 s                temp.im = 0;5 U  ?  N( o7 s8 w) r7 O% L: }" @
                    i1 = i;  p! r3 L" |& }
                    for (j = j0; j >= 0; j--)
    : B# o4 ~8 l# x5 E5 E8 f                {
    3 X( [: l$ @$ \0 e" k0 n1 d                        /* floating date operation */
    + `$ H0 M! Z8 a  t3 c7 b                }
    + \8 Z$ X7 ]0 ~  w
            }
    ( d- S2 S, E: X6 j  O5 t9 P}
    ) m' r$ _' D7 G7 l  s5 L# A- x! [' V
    xcorr函数代码如上,comp是复数struct, 做过长度为11、19两个矢量的测试,和octave结果完全一样9 ?7 h, V# N: l/ @/ \

    . [" ?& B! I9 I4 f红色部分是内循环,现在其内部操作都comment out 了, j0大概是 6000。" {+ d* W0 B7 _. X
    现在call xcorr 100次,耗时78s.) p( Y/ n0 G' X) {2 h3 Q

    - }' s9 |* w+ u% U8 o% e; Q如果把红色部分内循环本身完全comment out, call xcorr 1000次,耗时 <1s.
    ! K, j4 s9 J7 l( m% v3 N  g
    * b# o# n2 A3 D& G/ f
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    6#
     楼主| 发表于 2022-9-25 00:17:17 | 只看该作者
    风雨无阻 发表于 2022-9-24 23:33/ n5 |) X# i% Q  \7 a: ?* T
    Maybe Debug mode?
    2 I- O' i% l; T6 y  c) q' k" E

    8 O* w6 U# `; M不应该,看我上面的回复。
    + [0 a# s; y  N/ @: k, t
    3 K' }* `- y$ t: d我更怀疑是 VS 社区版的问题
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    4 天前
  • 签到天数: 1947 天

    [LV.Master]无

    7#
    发表于 2022-9-25 00:20:10 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 00:24 编辑
    ; n5 P1 [! I& w6 D) a# l
    雷达 发表于 2022-9-24 23:54( @# z# E% _8 ~& d8 U
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)! w- ]4 e8 F6 b& j7 K6 P
    {
    # y) Z# I9 s4 z- k0 B; K        comp temp, xtimesy;
    4 v. a( \  i# j/ k

    & g, q) L0 ^3 q) X/ }2 F% u. D  i9 t这个不是这么比的吧。。。
    " e0 L; M& M$ O' A& ?5 P3 g2 F& P7 N3 {7 d+ w* {, I' x
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    ; t# X2 s% w% z( ^, S2 m5 H% c
    4 y/ t6 u# T$ c而加上内循环,光jmp和dec指令就至少多执行了6000个,慢个几十倍不是正常的么?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    8#
     楼主| 发表于 2022-9-25 00:46:56 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 01:09 编辑 % b6 M8 Y" T; G! I* ^
    数值分析 发表于 2022-9-25 00:20
    , Q# X( }, u; ^% I# M: @; t! S! H这个不是这么比的吧。。。
    0 C7 v4 [: n! E
    , z; f0 Y0 m, M" `您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。

    4 r% k  N+ n5 v% v
    6 a! e, c4 K0 d有道理。/ |+ E  ]- J6 z% T9 t5 d) \
    所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,记得 numeric 库里有算向量内积的,我回头试试。) Y6 \* Y& l: G1 {, B/ h' K9 G  l/ g9 e. {
    0 D( h- F- a% x8 O$ f6 A$ p
    我先尝试尽量用标准库,一个小程序,不想搞得太复杂。多谢了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    9#
    发表于 2022-9-25 01:27:53 | 只看该作者
    雷达 发表于 2022-9-25 00:46
    / H6 F1 @2 r* |' M有道理。- a& l; ^" d+ D, z& V3 s
    所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,这大 ...
    4 @2 O) j' l' W! a0 y# B
    你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子,把循环本身翻译成机器指令loop或dec/jnz,两者速度上会差很多
    , I. D7 u. B; N" M* N; cWhy is the loop instruction slow? Couldn't Intel have implemented it efficiently?
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    10#
    发表于 2022-9-25 01:48:51 | 只看该作者
    数值分析 发表于 2022-9-25 00:203 H5 V* f2 e* \. d1 P- ^5 d: p" T
    这个不是这么比的吧。。。
    9 {% v6 w: M* n. ]3 T" k0 j1 K/ W* b# n8 `7 y# R" a- t
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    而加上内循环,光jmp和dec指令就至少多执行了6000个

    . F' }/ \% X+ S( T4 `- l; X4 }- y$ e6 M' ^' k. X
    现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果循环这样跑,花不了多少时间。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    4 天前
  • 签到天数: 1947 天

    [LV.Master]无

    11#
    发表于 2022-9-25 02:06:44 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 02:16 编辑
    + F. m3 ?* [# m* _  f. u
    沉宝 发表于 2022-9-25 01:48
    0 y' \  g  |$ A8 l7 w; o现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果 ...
    / c/ t4 i7 @( ]3 l4 P
    . X' W# z: A, Y. U+ _6 ]5 i2 A* X
    是的,兄台说的对。0 s1 z' ]! a3 O3 B# I& M

    5 Q' P, K  `: p: r其实我想说的是 真正数值计算部分和代码中其他不直接计算的overhead的比值这个事儿。+ `9 U; ~" T$ J
    ' X2 _" Z9 u2 C: p4 L
    雷达兄构造测试用例的时候,屏蔽掉了所有计算的部分,使得剩下的都是overhead,这样run time比较的结果就显得好像不合理了。如果把计算加回去,计算部分的run time会dominate,结果就不那么离谱了。因为不好说,所以用指令数对比的方式试图直观地说明这一点。
    - T3 x: F) [# l9 a* ~0 ?
    6 L) B/ _0 S1 |/ x比如说,如果有计算,那么跑六千个循环相对于计算应该用不了多少时间。但是如果一边是什么都不做,另一边是六千个循环,那六千个循环比什么都不做慢几十倍了,就不是那么不合理了。! I- \" D: p4 s7 z

    + r3 H$ h9 N" J6 a( |9 y: I当然也有可能像兄台说的,是优化参数的问题,但我觉得更多地是测试用例设计的不合理。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    12#
     楼主| 发表于 2022-9-25 04:47:43 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 04:49 编辑 ' {) @! Y9 o$ H3 K
    沉宝 发表于 2022-9-25 01:274 ]0 u8 A: _7 h9 \
    你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子 ...

    6 _- V5 M' D3 p6 K& ]) ^* K* B* _( _2 g* N% K; W
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差一倍,我上面这个差的太多了。
    0 M4 Q0 D3 _  h# e. `
    3 ]! b! y$ }6 d; n我已经完全懵了。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    13#
    发表于 2022-9-25 05:51:23 | 只看该作者
    雷达 发表于 2022-9-25 04:473 ^5 W, i' v3 g7 i5 v) B
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...
    5 K2 ~+ K7 p  V+ Y! h0 l( i  g
    时间差一倍的结果可以接受。
    0 f/ |2 i7 ?0 _
    ! [" |9 m" U- N( m8 g; k$ O你还是用profile工具看看吧。现在大家都主观瞎猜。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    4 天前
  • 签到天数: 1947 天

    [LV.Master]无

    14#
    发表于 2022-9-25 14:58:59 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 15:38 编辑
    3 n4 K1 [9 ^9 H6 T) p
    雷达 发表于 2022-9-25 04:47
    ) Z) E: ~8 z' R, T. X又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...
    ) ?! u1 C  W4 M0 y
    ( k7 p* C# [9 y6 O
      X, G8 l& h% ^1 g' q- o7 a! E9 \

    : [; ~2 n5 v9 z$ U4 _" z; O- `能不能把这个也贴上来,看看和上一个有什么不同?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    15#
     楼主| 发表于 2022-9-26 01:30:03 | 只看该作者
    本帖最后由 雷达 于 2022-9-27 01:17 编辑
    , V1 P2 q6 ]6 @2 T: O# Z, W5 C: [* N+ h
    数值分析 发表于 2022-9-25 14:58
    - V/ v7 k5 ~  C! p1 l2 J能不能把这个也贴上来,看看和上一个有什么不同?

    4 Z5 s4 z' N* }5 N' o理了理思路,重新做了一个测试。
    3 O1 N! Q0 @' k4 Y6 _4 O- k$ L做了两个 vector 和 两个 float *, 都长 100000
    ; G% G! {# M4 o, o) T外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
    9 X% f! o: H2 Q) l9 r& b! h* w8 a7 g! ?2 h( o4 R9 o4 R  [& S
    内循环试了4种方法,2 c/ C7 U# u. K* {
    1. 直接调用 vector inner_product 247s
    ( Y; y0 z$ u* y4 b6 p* ]2. vector 循环点乘累加 237s% ~( S% L, X3 i7 E/ U+ k$ }
    3. float * 循环点乘累加 204s1 Y& s7 `- A, P
    4. 空循环 100000 次 202s& c4 p  j2 u: I1 t1 N

    ( N9 Y5 A$ h( I* e2 |, [不做内循环 200s
    & \' b; o; l% q% p8 s
    4 d  p+ N+ t; F你昨天说的对,内循环本身占比是很小的,大头在其他处理。" ?8 _; v; m% h5 Q* h* ]
    另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
    8 b3 \* n* s. @2 J% T4 H( h) c% M0 u5 Z7 A% l
    至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)4 Q9 ^9 m9 r1 i' c* ~- e
    9 ~# l$ ^/ @) P1 _" e) W9 a5 }9 Q- _) ?
    (为什么下面我贴的  b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成  jj 好了,原来 方括号里的 i 是斜体标志  LOL)
    ; D' w& R5 k8 e) b
    5 y. ]3 z6 ]$ j: u$ b. W4 ?& e
            std::vector < float > vec1(N);
    ' p; f7 J6 G* h5 Z8 Q4 B5 Y        std::vector < float > vec2(N);1 {2 X0 @; T/ R
            float* b1 = new float[N];
    : u5 f' \; o" K3 R        float* b2 = new float[N];
    . J6 L5 x6 y. T. k; k) A% m1 i. {& ^" e6 B8 X2 H
            for (int j = 0; j < 6000; j++)
    # j# N+ W' }3 N8 R& v        {
    7 t# P( N6 y6 z+ f( |9 v: G                std::generate(vec1.begin(), vec1.end(), []() {
    ' u: _5 i# ^0 p8 r/ O; x                        return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
    ; H: L2 ?$ J' i, Z' ^2 @* Z6 Y                        });9 R& M7 \% J4 i' }5 {

    ' T* L' `: l, q" ^                std::generate(vec2.begin(), vec2.end(), []() {
    5 u9 F" b2 o& z5 p# s- I                        return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;0 a) a7 ?& W  ?/ R" |5 B4 G4 E
                            });
    ) o/ H) f$ I1 O3 T  v# e/ N/ Z- l: h- n6 W. Y" J5 R8 K
                    for (size_t jj = 0; jj < vec1.size(); jj++)! x; _1 g: }% _9 Q' ~
                    {
    + d/ l4 t0 z6 G% x                        b1[jj] = vec1[jj];
    8 e5 r" O& M& l4 V$ F                }
    " f4 b. m% E. ?0 ]+ d+ V2 l. k7 o! c5 }5 b
                    for (size_t jj = 0; jj < vec2.size(); jj++)
    0 M6 s5 g0 x3 e  q2 [3 Y5 S" p8 E                {4 G" n7 w" R0 P" n9 {
                            b2[jj] = vec2[jj];
    ) w# {4 g" D) b                }4 ~7 {; t/ D" Q9 O" h) T% p2 c# j1 T
    : ~3 c# L' W4 W5 G1 s, h1 _& E! F
                    //Method - 1  N=100000 247s  6 r1 O8 M0 {- c% H3 _
                    //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);1 W2 R/ w7 w0 `- o( c
                                    1 R: l* g. k% J+ _  r
                    //Method - 2  N=100000  237s) s5 k' p5 L/ s
                    /*
    ; Q/ C$ }( T) T3 H+ V* j' L                for (int jj = 0; jj < N ; jj++)
    . K* h% s( M# y" z3 n/ w                {
    - s) u( S) U4 T% G! z                        fresult += vec1[jj] * vec2[jj];
    . y/ ?+ o: L3 A9 P2 b1 H                }
    2 @: T# }/ M9 h) O5 p% I                */4 A  X* j5 _5 p8 j# I* Z5 X$ r
                                    7 |( L& @; M8 {8 M) ~
                    //Method - 3  N=100000 204s
    0 i5 `& K4 L6 v* l- Q& n! i                /*
    ' E0 k8 J5 e& v2 H3 p                for (int jj = 0; jj < N; jj++)
    . k8 `! C& V7 F2 Z$ _, y" P5 i                {3 b0 n0 M, L# N; q9 D; V' U
                            fresult += b1[jj] * b2[jj];& |4 P, N* h- n5 R
                    }7 x  c  Y, z6 h% l- [
                    */! X8 g4 v; [- m1 f

    6 g% a7 N+ W7 |' R                //Method - 4   202s
    - c1 p) T) A  L/ A: V' f# p$ ?                /*
    1 ]0 c* U# o; ~) ^# c/ Z7 k                for (int jj = 0; jj < N; jj++)
    0 ~. n  [- `+ W$ C+ ?                {
    0 n; B" H7 C3 K: |7 U$ ?                        / s. s4 \/ h. l3 M) ^) A# S
                    }& d1 A( D4 ^5 S  i1 ^
                    */
    ( t7 b3 H' x& Y0 m4 c: C/ ^                //comment out all methods, N=100000  202s                ; Y2 c5 ^& W& ^2 a9 j0 ]
            }4 U1 |* T9 @  ]$ N1 U% h
    1 b' ^# B1 @, }9 {% [
            delete []b1;# l) @3 Y$ r4 ]  ^6 E/ V
            delete []b2;

    ; u; f% T# G8 ?1 u8 L) t- p6 v
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    16#
    发表于 2022-9-27 00:15:38 | 只看该作者
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?; J! O5 l+ C9 ^3 w
    ! R# W: p3 c( M# F% ?% G: l
    你第二个试验里面的j在循环里面又重新定义了啊,你确定真的跑了6000次?& f- ?4 R4 }" K  z  z* ?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    17#
     楼主| 发表于 2022-9-27 01:16:03 | 只看该作者
    机器猫 发表于 2022-9-27 00:15
    4 g3 Y$ o: i+ `% D瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?
    $ B' {0 @& E7 P( u
    , g. x  V" P9 {$ f  H/ d9 N你第二个试验里面的j在循环里面又重新定义 ...

    - |' O' z+ C7 n/ u" f3 \3 o内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL
    2 \3 e/ L) v7 W9 C8 t% W# ^) n" {" D1 T- U
    不和它较劲了,瞎耽误工夫,我已经转到 ubuntu, 也准备顺便试试 avx2 向量化。
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    18#
    发表于 2022-9-27 02:06:58 | 只看该作者
    雷达 发表于 2022-9-27 01:168 I& y! I# w. r! W. t# E7 a( s
    内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL- x4 l* K: z" z  H/ S" I
    & N, ~6 K7 {* {: h1 d: y7 M% ?5 K2 l8 A
    不和它 ...

      _5 |4 j/ F! k. P
    + N5 Y3 g7 n) W. x6 {+ F不过可以试试我说的register变量。前一个试验j是混在一堆其它变量里一起定义的,很有可能是在stack上,这样内存读写会更多,要是再碰上每次都需要加载cache就更慢了。  E$ E  j( l' M7 O" y$ l& M' g
    后面一个是在循环那里定义的,说不定编译器就把它优化成register变量了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

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

    使用道具 举报

    该用户从未签到

    20#
    发表于 2022-9-27 20:29:50 | 只看该作者
    雷达 发表于 2022-9-24 23:54  Y4 \8 K0 Q6 u5 Q2 w: P$ T
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    4 f8 s3 H! d% q$ N9 d6 r. m{
    # d+ E0 ]  K3 J# f- ?/ L# ]. z0 n2 C        comp temp, xtimesy;

    ) C) n2 P. |. H/ e! V' d这个code里面如果Openmp没有被注释掉的话,那么temp那个变量应该是定义在循环里面,否则线程之间会存在争夺写入那个temp的风险。5 r- I6 n( P3 @
    内层for循环如果没有内部操作的话,编译时应该被优化掉了,和你完全注册掉整个循环是一回事。可能你的编译设置没有打开优化?% s5 ?) Z, l  ~) w- V2 G
    VS社区版没有问题,我工作用的就是社区版,设置正常的话不会比商业版差。以前游说头头用Intel Compiler,他说不想花钱,而且差不了多少,就一直用到现在。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2025-10-15 16:25 , Processed in 0.054276 second(s), 19 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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