设为首页收藏本站

爱吱声

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2022-9-24 22:54:26 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
    C++ 比 Octave 慢好多,怎么破?
    7 d" _! G! n, Z- p" ~# y9 W5 l, g- h$ S
    自相关两层循环,内层循环涉及浮点数计算,试验了一下把内层循环内部全都 comment out 只留个壳子,  但空的内层循环本身就把速度拉下来了,看来问题并不在浮点计算。
    1 r2 k! t9 m0 ]: X$ m$ Q
    ( K  y; c( u$ j3 m+ k速度优化问题真的很有意思啊。
    " `) g$ @) f  ]; a; c( f# `( U, j+ x1 Z) z. A- q
    欢迎大家继续讨论

    评分

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

    查看全部评分

  • TA的每日心情
    开心
    昨天 04:43
  • 签到天数: 1942 天

    [LV.Master]无

    沙发
    发表于 2022-9-24 23:04:16 | 只看该作者
    拉下来?拉多少?0 S6 V) E% Q. v0 Y+ j2 D+ [+ ~, [
    把代码贴上来看看?4 j2 x& b- T9 y% U. h- {& o
    " ^5 e0 r5 a: W# T
    难道分支预测不准破坏流水线执行?不该啊。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    板凳
    发表于 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的每日心情
    擦汗
    2024-12-25 23:22
  • 签到天数: 1182 天

    [LV.10]大乘

    5#
     楼主| 发表于 2022-9-24 23:54:10 | 只看该作者
    本帖最后由 雷达 于 2022-9-24 23:57 编辑 " P5 _+ ~8 N' T
    数值分析 发表于 2022-9-24 23:049 y1 w1 d  \+ ?& n( s/ E; x" I( E0 U
    拉下来?拉多少?0 t0 o4 D6 d; o0 Z5 \' {
    把代码贴上来看看?
    ! i+ i7 A2 I( b! f: h) m# u0 l

    0 \; M) F1 W& l8 F5 ?! qvoid xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)4 z& \! |, M3 I( O- @7 h, S! m
    {
    ) a, G! [8 o# \        comp temp, xtimesy;2 e2 y2 G1 Z& N3 `
            xtimesy.re = 0;
    / V$ ?# b! @, Y+ E: \. l1 e/ q        xtimesy.im = 0;
    - Q; b$ c( ]3 l% Y# H        int j0 = lenB - 1;
    * S( |8 ?% `0 Z; Y8 Q        int    i, j, i1, reali;
    # G. K% a0 i! c; ?( G  V        if (lenA % 2 == 1)+ ]4 M3 \) h0 y7 Q
                    reali = lenA + 1;
    5 d+ \  ]: a* z) i+ B        else
    # h0 i* g4 q, z8 i6 s) s                reali = lenA;# y; r5 i+ _' |* k1 a/ e
            reali /= 2;( ~* [  s6 h0 o" {! x

    / f( r4 F3 X) W( D4 j% X        int nconv = reali + lenB;  X7 F1 P( i* a5 m' `" C! M( h
            //#pragma omp parallel for& C( C- \( J# h# K1 f
            for (i = reali; i < nconv; i++)
    / K$ W0 n/ f) r# b" I/ a- R0 Z        {: p$ V& i# D  s7 e/ x7 W
                    temp.re = 0;
    ( o+ y! s, n$ g! V. L2 b3 e3 K                temp.im = 0;* j* L0 @- m; m
                    i1 = i;( |1 ]+ E% e. d0 J" o
                    for (j = j0; j >= 0; j--)
      j0 Q5 n9 n5 {. s2 i4 \. r, E                {
    + c1 N  \/ J' Z; N. o                        /* floating date operation */
    , Z4 J2 m) G9 V$ B" z( o3 V8 y                }
    ; {; _" ?5 @) [
            }$ }% F  O7 j. c0 Z% L! p
    }/ `- h: y: l. n+ a: y+ z

    4 m3 F! Z# t4 `: p( P7 V$ Yxcorr函数代码如上,comp是复数struct, 做过长度为11、19两个矢量的测试,和octave结果完全一样: E0 E' o6 K/ D' t0 y
    * L: V# J0 F1 \# }
    红色部分是内循环,现在其内部操作都comment out 了, j0大概是 6000。% F( j9 d6 g5 _+ k0 J6 \
    现在call xcorr 100次,耗时78s.9 C! i7 \; I) _  P& C1 G

    0 P8 ?1 r) R4 q: N- g4 @! e如果把红色部分内循环本身完全comment out, call xcorr 1000次,耗时 <1s.   L4 ?+ s" p% o9 i& h$ m# z" T

    0 `7 J7 ?3 i2 |$ b5 Z( J3 X
    回复 支持 反对

    使用道具 举报

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

    [LV.10]大乘

    6#
     楼主| 发表于 2022-9-25 00:17:17 | 只看该作者
    风雨无阻 发表于 2022-9-24 23:33
      E. d7 I( P, Q% T# kMaybe Debug mode?

    ! z7 y% ^9 l8 P3 v. g9 J6 F% `8 b
    % T/ ~/ Z# _$ z; T" q不应该,看我上面的回复。
    9 B  D$ {3 l; G1 U6 s+ F1 S
    : [" R' d' {. u. r& J8 X* T, p我更怀疑是 VS 社区版的问题
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    昨天 04:43
  • 签到天数: 1942 天

    [LV.Master]无

    7#
    发表于 2022-9-25 00:20:10 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 00:24 编辑 7 E7 ^( S6 N, D% l  s+ Y  H3 A
    雷达 发表于 2022-9-24 23:54
    3 x8 o* I5 i7 n2 R  b1 h+ r$ X9 Tvoid xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)  v) M$ R8 X9 U; j% V- |
    {% L5 X! @# A2 z) y6 h& ~# e
            comp temp, xtimesy;

    5 s2 ]- V+ x3 \% k
    + v8 X6 U! k7 U3 W这个不是这么比的吧。。。
    ) e' `  `3 E4 f* D0 x, M" _
      a" q! u: e7 ~9 B您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。, b- C+ s4 \$ I9 R

    , F  Z$ x# E: X5 @5 q. Q而加上内循环,光jmp和dec指令就至少多执行了6000个,慢个几十倍不是正常的么?
    回复 支持 反对

    使用道具 举报

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

    [LV.10]大乘

    8#
     楼主| 发表于 2022-9-25 00:46:56 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 01:09 编辑
    3 [' L' p3 N0 |  V( L1 u
    数值分析 发表于 2022-9-25 00:20; ^/ ~2 j. r" V# k( h0 K. Z
    这个不是这么比的吧。。。  V8 V! \1 j0 H6 b9 G' W. N" B

    * m1 M" P5 z7 y) }您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。

    / l3 {& r; U! e8 o0 o. T, m/ s& j; e% }% J8 Z( T; g+ E
    有道理。) {  i5 c' x( d* P# d7 {: E
    所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,记得 numeric 库里有算向量内积的,我回头试试。0 ?  g, ~* p0 w5 B* u+ z
    " Z7 Y" W8 u2 D" M, T6 \
    我先尝试尽量用标准库,一个小程序,不想搞得太复杂。多谢了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    9#
    发表于 2022-9-25 01:27:53 | 只看该作者
    雷达 发表于 2022-9-25 00:46
    , t6 G& F. |; s) @, [9 a; n' |8 k" x有道理。
    * \- x# Q! L1 D" T4 P7 D8 }所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,这大 ...
    , Z" q, Q. T. s
    你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子,把循环本身翻译成机器指令loop或dec/jnz,两者速度上会差很多
    - @. r( T4 N+ r) R" s3 PWhy is the loop instruction slow? Couldn't Intel have implemented it efficiently?
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    10#
    发表于 2022-9-25 01:48:51 | 只看该作者
    数值分析 发表于 2022-9-25 00:20
    ! d* p1 {: L2 z( I4 h4 D- `7 k这个不是这么比的吧。。。; T) K( b+ D( M2 r/ a

    8 j" x" ~  H( y& ?$ ~5 c" R您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    而加上内循环,光jmp和dec指令就至少多执行了6000个
    5 w6 ~: a' n! @4 L& P- E4 l

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

    使用道具 举报

  • TA的每日心情
    开心
    昨天 04:43
  • 签到天数: 1942 天

    [LV.Master]无

    11#
    发表于 2022-9-25 02:06:44 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 02:16 编辑 4 z3 s7 w5 d! k; v* V: C( ~
    沉宝 发表于 2022-9-25 01:48! S6 `7 i1 G9 N; y* u) I8 d
    现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果 ...
    3 K+ O# V7 h- E! [4 N- m5 ?
    ' `! |/ j! b' N; o
    是的,兄台说的对。
    - ]5 N, t1 e2 O* |2 H
    3 T1 M0 I* M+ L其实我想说的是 真正数值计算部分和代码中其他不直接计算的overhead的比值这个事儿。* B4 q5 i9 t5 J3 W

    $ z" a- z( Q  I雷达兄构造测试用例的时候,屏蔽掉了所有计算的部分,使得剩下的都是overhead,这样run time比较的结果就显得好像不合理了。如果把计算加回去,计算部分的run time会dominate,结果就不那么离谱了。因为不好说,所以用指令数对比的方式试图直观地说明这一点。: P6 ^  S5 D3 B# Y) W: v

    / O/ q1 q2 b/ P6 X, X比如说,如果有计算,那么跑六千个循环相对于计算应该用不了多少时间。但是如果一边是什么都不做,另一边是六千个循环,那六千个循环比什么都不做慢几十倍了,就不是那么不合理了。- o2 w* }9 C* }5 t% H
    ) B! |& a) ]2 [
    当然也有可能像兄台说的,是优化参数的问题,但我觉得更多地是测试用例设计的不合理。
    回复 支持 反对

    使用道具 举报

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

    [LV.10]大乘

    12#
     楼主| 发表于 2022-9-25 04:47:43 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 04:49 编辑
    . R+ n! Z2 s* b) P5 o) L  o
    沉宝 发表于 2022-9-25 01:270 {3 C5 B. O: a3 j" }$ e
    你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子 ...
    * k1 h2 b, L/ f" Z- G3 ~  W4 t4 w

    / y1 |& x, W; |' k6 o又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差一倍,我上面这个差的太多了。
    8 h3 m/ E9 x: [8 v  L% a9 `. ~4 w0 e0 ~( T* t, F
    我已经完全懵了。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    13#
    发表于 2022-9-25 05:51:23 | 只看该作者
    雷达 发表于 2022-9-25 04:47
    3 Q6 o( E0 O( K% t7 [# U: _5 |又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...

    3 C, {' T5 P) I6 D% F时间差一倍的结果可以接受。
    5 l( w* X, J( U: V8 W6 e% D: H" g; d6 B: }# j' [
    你还是用profile工具看看吧。现在大家都主观瞎猜。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    昨天 04:43
  • 签到天数: 1942 天

    [LV.Master]无

    14#
    发表于 2022-9-25 14:58:59 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 15:38 编辑 # i: R+ z4 |2 m/ t6 j
    雷达 发表于 2022-9-25 04:47
    9 k$ P3 }3 o6 z$ V: N又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...
    2 U" o* v! Q- |3 N/ h3 P
    4 Y' ^2 Y1 k8 f* ^; m. V
    , y5 ^$ u7 e* w1 y2 g
    + @- T( Q' D/ h7 k' I( Q" b0 f! o
    能不能把这个也贴上来,看看和上一个有什么不同?
    回复 支持 反对

    使用道具 举报

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

    [LV.10]大乘

    15#
     楼主| 发表于 2022-9-26 01:30:03 | 只看该作者
    本帖最后由 雷达 于 2022-9-27 01:17 编辑 4 H% F6 s, z; Y' f6 C7 E, S
    数值分析 发表于 2022-9-25 14:588 _( h# L  t* L0 i4 u( s. @% r9 v2 _: d
    能不能把这个也贴上来,看看和上一个有什么不同?

    $ w  ~+ k+ d5 D# X$ E理了理思路,重新做了一个测试。
    7 _0 C2 B; ~% T- n2 {做了两个 vector 和 两个 float *, 都长 100000! k9 |4 a. F4 ]& @) S( |/ Q
    外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
    . T4 g+ Q$ b. X0 b, j2 H0 I$ ?) r& Q& @, |  ]/ L
    内循环试了4种方法,  Z8 C, @. r; G# A1 h
    1. 直接调用 vector inner_product 247s
    1 q" L0 Z, M; s  y2. vector 循环点乘累加 237s
    : ^% q) G6 L4 V$ ~3. float * 循环点乘累加 204s
    0 C& [' |8 c7 |5 x  L& A' ^& {4. 空循环 100000 次 202s
    , a; ]8 }: X2 l; _% ~
    ; g7 A, |4 F4 Z% ^$ E1 t* i不做内循环 200s
      D) V, y. h, _4 K
    1 \6 g  Z+ ]3 g1 A你昨天说的对,内循环本身占比是很小的,大头在其他处理。4 [/ B, i! c3 o+ Y6 [3 R: d% S9 Y4 K2 O5 z
    另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
    9 I% b  E# c& G/ ~9 F6 G, H1 h/ l
    0 X3 n$ s1 t- q; T至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)- l+ N/ K( f8 f0 ~) Q
    + w  B' g9 w9 o2 ~: z
    (为什么下面我贴的  b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成  jj 好了,原来 方括号里的 i 是斜体标志  LOL)# Z2 x  |0 x4 L6 v8 U
    5 K) `1 c* p; d) N/ K3 b
            std::vector < float > vec1(N);
    ; b1 g; e9 I9 _1 A1 k        std::vector < float > vec2(N);% s& \8 i6 m& ~
            float* b1 = new float[N];- [& \7 q2 `" n: w
            float* b2 = new float[N];
    $ ^! T! {9 g' t- a7 D5 }1 ^% g: b8 w) k# h
            for (int j = 0; j < 6000; j++)
    ! D% i! x: Q; L! }5 m1 _        {- T) i) [# N+ s) Z! d  K
                    std::generate(vec1.begin(), vec1.end(), []() {) D! z% R& E' o* B& F; v
                            return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;5 [% _  N; E! v
                            });, M0 T2 I/ _! j2 ?0 ^
    2 D& r5 b( Y# ~( ]
                    std::generate(vec2.begin(), vec2.end(), []() {* W" c! e; t  s8 b
                            return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;* P8 _3 |9 n0 M% q0 C) F
                            });4 f: S2 z7 l# N% {

    * k3 G; x6 J& a+ Z+ M9 Q5 k                for (size_t jj = 0; jj < vec1.size(); jj++)6 c/ {. t4 \6 ?7 F6 V4 B
                    {
    ( {7 \* X9 N1 ^: ^                        b1[jj] = vec1[jj];; M1 O0 t+ }0 X% S
                    }& n+ ?  t9 d0 x) s! f" e& z' [
    / t* _$ p  A( g, K* v
                    for (size_t jj = 0; jj < vec2.size(); jj++)
    & Y) F; l+ I) _                {% D: A% G4 ~( L% ?$ O
                            b2[jj] = vec2[jj];( @& K+ e0 c- U9 N+ v1 v- y* w
                    }0 z9 R% `+ G$ ?1 u# y
    ) U% S& H4 C% B6 S* y
                    //Method - 1  N=100000 247s  
    1 e5 W$ e. ^4 w                //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);( |1 J$ ^* P5 q/ j: ?
                                    
    6 p* P0 O0 v0 Z/ n" j' |                //Method - 2  N=100000  237s
    $ M! C8 c& o; @                /*
    ) B( d! |" K& k; a8 k                for (int jj = 0; jj < N ; jj++)
    % O2 U$ W' l1 v2 L# C  U7 A" h! k                {
    ; Q; {3 G9 p$ I, ^! g/ T; j                        fresult += vec1[jj] * vec2[jj];3 F1 _+ v# ?/ {' v
                    }# j# D1 W5 w  s' Z0 r
                    */" a% N2 b7 g6 k" A- j4 \
                                    
    ; [6 v! n, `. O9 w  A- C# D                //Method - 3  N=100000 204s
    * b; ]" ]9 g2 \2 \                /*. S& c5 N% z$ }" e- e3 x6 l9 ^
                    for (int jj = 0; jj < N; jj++)
    / s) X+ x( r1 b. i; C, A/ S: Z% M                {
    ; {3 e* r* e- T3 Y; Z                        fresult += b1[jj] * b2[jj];
    2 l/ a/ W- ?9 x! p: d# Z1 y                }) b! M' M) ~5 Q8 Q
                    */
    5 N+ H9 f% K8 B
    : [* ~  G* {. k. K6 l& [                //Method - 4   202s
    7 }% S7 u! }* ?                /*
    ) {7 f& \5 B% z' n                for (int jj = 0; jj < N; jj++)
    ' J& O% g6 \2 E                {3 X# i  t7 Q6 i/ G
                            / n: W" b: ~  p' I5 P
                    }
    + |9 U8 l; l# M" R$ E+ M                */4 m  p; k! p# R$ d
                    //comment out all methods, N=100000  202s               
    $ i9 }+ p' J6 x8 w+ ^5 U* _        }
    9 z3 K5 N3 d$ M; H8 x2 `8 z% ?# k/ D1 X( K' _2 D( H0 D4 l
            delete []b1;! r1 H. `6 m: U! G9 N0 w4 E$ ^. Z2 J
            delete []b2;
    & q5 H4 L9 I4 y- W" L, n
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    16#
    发表于 2022-9-27 00:15:38 | 只看该作者
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?2 @& M( t1 s/ e9 Y1 v( y- d0 L
    + L* ?" {' P* k. O1 z" F
    你第二个试验里面的j在循环里面又重新定义了啊,你确定真的跑了6000次?4 i: e) |+ v0 Y
    回复 支持 反对

    使用道具 举报

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

    [LV.10]大乘

    17#
     楼主| 发表于 2022-9-27 01:16:03 | 只看该作者
    机器猫 发表于 2022-9-27 00:15- B, M8 T( ]' Y  H
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?4 k8 G1 ]# s% g3 B. T- H+ |$ f

    " V1 b( D6 W; a4 `你第二个试验里面的j在循环里面又重新定义 ...
    * Q/ d' i$ Z5 o( b. P# e6 p
    内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL
    : D- b5 b& Q5 ~7 F9 e/ ]: G8 l% _  P5 g  b
    不和它较劲了,瞎耽误工夫,我已经转到 ubuntu, 也准备顺便试试 avx2 向量化。
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    18#
    发表于 2022-9-27 02:06:58 | 只看该作者
    雷达 发表于 2022-9-27 01:16( F- C5 ?7 r/ x3 j! R
    内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL
    / d3 |# I7 V- }6 G& `
    , f7 y/ N2 _& n2 f1 Q不和它 ...

    8 d. [5 f7 h4 `( s8 S1 W; c$ G" C0 ]( n0 m& x5 U& j
    不过可以试试我说的register变量。前一个试验j是混在一堆其它变量里一起定义的,很有可能是在stack上,这样内存读写会更多,要是再碰上每次都需要加载cache就更慢了。
    5 s7 _  {4 }6 U( t% w, z, {后面一个是在循环那里定义的,说不定编译器就把它优化成register变量了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

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

    使用道具 举报

    该用户从未签到

    20#
    发表于 2022-9-27 20:29:50 | 只看该作者
    雷达 发表于 2022-9-24 23:54
    0 f# a% |1 n( ~) }void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    & a% Z% u1 y! O# R$ s5 X{/ f" [: l/ p) ^- z5 u
            comp temp, xtimesy;

    , c% R( _1 G7 g8 M这个code里面如果Openmp没有被注释掉的话,那么temp那个变量应该是定义在循环里面,否则线程之间会存在争夺写入那个temp的风险。
    2 N' P& r, D6 \& m" e" D: l内层for循环如果没有内部操作的话,编译时应该被优化掉了,和你完全注册掉整个循环是一回事。可能你的编译设置没有打开优化?# T( C% N2 w) V. A/ C, m( l( `
    VS社区版没有问题,我工作用的就是社区版,设置正常的话不会比商业版差。以前游说头头用Intel Compiler,他说不想花钱,而且差不了多少,就一直用到现在。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2025-9-19 04:10 , Processed in 0.052397 second(s), 19 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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