设为首页收藏本站

爱吱声

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

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2022-9-24 22:54:26 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
    C++ 比 Octave 慢好多,怎么破?
    . R) X5 w6 }' u$ p: S7 H( ^7 d& |; c6 K; @1 j$ l( G# _$ F
    自相关两层循环,内层循环涉及浮点数计算,试验了一下把内层循环内部全都 comment out 只留个壳子,  但空的内层循环本身就把速度拉下来了,看来问题并不在浮点计算。6 s/ q! ?0 J6 P, e1 p

    ; @( a/ U& P6 Y, ^' {0 W速度优化问题真的很有意思啊。
    * ?6 d. f  g- m+ }
    ) {4 `0 o3 j0 c; u9 s" n欢迎大家继续讨论

    评分

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

    查看全部评分

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

    [LV.Master]无

    沙发
    发表于 2022-9-24 23:04:16 | 只看该作者
    拉下来?拉多少?
      x9 S2 L& g* n: Q, g9 B把代码贴上来看看?+ W' u7 Z* j: [0 t

    ' O$ c; i2 ~0 D3 N2 W/ j5 |难道分支预测不准破坏流水线执行?不该啊。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    板凳
    发表于 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 编辑
    ; Y7 [! o+ Y7 t5 S1 p) S3 u
    数值分析 发表于 2022-9-24 23:04
    ) y! r. l, x6 l  p拉下来?拉多少?
    . S% y* e" ~1 p5 [5 D1 q/ h0 ]3 p把代码贴上来看看?
    ! n" q6 m. o: r1 l) l
    + `6 j3 S; I1 R2 f5 l
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    9 Z5 v8 [- p$ X' e) O4 x{
    $ f9 T: m7 n( y2 N# U, ]        comp temp, xtimesy;9 u5 M3 v3 E8 \) {: L' G  G
            xtimesy.re = 0;1 h7 }( \, B& l- s7 h, E: S
            xtimesy.im = 0;% d3 |& ]* f5 B
            int j0 = lenB - 1;
    ) Z6 d% o' A3 X+ P4 B% M) {0 d  G        int    i, j, i1, reali;* G7 M# {9 U* ~" D8 M6 `
            if (lenA % 2 == 1)% G$ N6 Z1 i7 x5 _; S
                    reali = lenA + 1;0 I/ m. |6 I5 Z  ]
            else5 @) q& Q: d$ n0 x- f# @
                    reali = lenA;
    , f: Q6 `1 d8 y        reali /= 2;
    & Q8 k7 Y2 [# a; u! P- y" w0 V+ Q. t; C$ k/ N. Z
            int nconv = reali + lenB;
    & Z7 z* N1 g7 a! C9 \( l        //#pragma omp parallel for3 y9 e/ l( K2 s( F0 E
            for (i = reali; i < nconv; i++); J8 a, J) e# a
            {5 N. M4 V# J) d$ E3 i8 u
                    temp.re = 0;
    3 L0 R% ]) \9 O% y! Z2 G0 @0 B                temp.im = 0;
    # J1 n2 Y3 c- b3 I                i1 = i;
    ( X6 M- _" ~" a8 V                for (j = j0; j >= 0; j--)
    ( {% I. O- Q. V* ]6 U( O                {
    / G$ @) E) X7 m                        /* floating date operation */1 _& U1 ?# ^' u2 n* c
                    }
    % x( ^) ]; E3 r  ]$ f; Z
            }7 W2 O0 j, g/ r
    }4 U; R0 {9 a* E

    8 i  r* p: w4 m! U' Wxcorr函数代码如上,comp是复数struct, 做过长度为11、19两个矢量的测试,和octave结果完全一样
    6 [, d0 I. H- l' D" L' F6 H! _
    / T8 c: r: T+ @6 [) R% p红色部分是内循环,现在其内部操作都comment out 了, j0大概是 6000。# M7 K# n- [+ ~3 ~0 _% a; }
    现在call xcorr 100次,耗时78s.( O' W2 v4 A" j5 h9 {% r4 L
    1 d# o  s1 A2 U/ u( U6 J+ {2 i
    如果把红色部分内循环本身完全comment out, call xcorr 1000次,耗时 <1s. . I+ n9 n9 g  n2 o. E8 L% N, G# {

    , |+ s* `0 I" U7 T. v
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    6#
     楼主| 发表于 2022-9-25 00:17:17 | 只看该作者
    风雨无阻 发表于 2022-9-24 23:33
    2 s. m7 z3 |2 ~2 U9 d* IMaybe Debug mode?
    . G! K' ~1 E% v4 P, B- Q; x

    9 U: v5 o( Z9 ~$ L" a不应该,看我上面的回复。
    . }3 e- t7 y! d& \* {
    8 Z) H; n; S, Z, w: U% R' t我更怀疑是 VS 社区版的问题
    回复 支持 反对

    使用道具 举报

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

    [LV.Master]无

    7#
    发表于 2022-9-25 00:20:10 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 00:24 编辑 * o2 k' C$ x; {9 b
    雷达 发表于 2022-9-24 23:54
    : e8 D6 `' A$ t& h4 H( Y1 vvoid xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    3 n+ Z5 u$ U, v{! q  \: ^  t8 w8 W& R9 g
            comp temp, xtimesy;

    2 X+ ~9 d" b+ _/ i9 O% h
      S8 p9 l" f1 A5 q; y* r2 V这个不是这么比的吧。。。
    $ @8 T$ |8 F1 z' H1 N/ K1 ?6 K) }% l$ G9 `- P$ p
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。: t( O7 L, l# s+ h# _

    ! S" |+ w$ u/ \( ^而加上内循环,光jmp和dec指令就至少多执行了6000个,慢个几十倍不是正常的么?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    8#
     楼主| 发表于 2022-9-25 00:46:56 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 01:09 编辑
    ! R* J- n  ^1 m; I% \. D. b
    数值分析 发表于 2022-9-25 00:20! t( ?7 g, W9 i7 R% ^7 P
    这个不是这么比的吧。。。
    5 E5 E- u1 b$ _+ t
    % }5 J9 L6 T+ R' F* w您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。

    8 L8 E2 t: u5 J) R$ ~8 |" w: W; \( {* X. z. x% F
    有道理。
    / y9 Q9 N0 ?  D* a所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,记得 numeric 库里有算向量内积的,我回头试试。, N5 b# ^5 e; _; P8 {# J1 o/ T

    + H- m/ ?+ @7 r- g我先尝试尽量用标准库,一个小程序,不想搞得太复杂。多谢了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    9#
    发表于 2022-9-25 01:27:53 | 只看该作者
    雷达 发表于 2022-9-25 00:46
    8 C# a8 l0 I5 l, z( p3 M有道理。! _  \% j. Z) L
    所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,这大 ...
    $ K& }& Z: ?; ^9 o9 B) ^
    你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子,把循环本身翻译成机器指令loop或dec/jnz,两者速度上会差很多8 B: ^+ ?3 W" n1 v. H. H9 A8 j' ?
    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' C; w  ?- e. x. m' m
    这个不是这么比的吧。。。9 u$ o  Z5 V) N' ?3 h
    / o: C) U2 C) Z3 G5 ^: p* q4 ?/ y
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    而加上内循环,光jmp和dec指令就至少多执行了6000个
    " ?3 _8 w% ~7 K2 g3 w% k
    7 l7 f) z0 z9 Q
    现在的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 编辑
    & O8 O. N0 E3 q1 q
    沉宝 发表于 2022-9-25 01:48, a3 Q* W+ f8 g+ m6 z
    现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果 ...

    9 Z9 x% u% N4 @) H
    4 o) b+ |1 L3 l6 Z/ G$ Z0 S是的,兄台说的对。
    + K2 {6 b/ s& t, V9 n' [. ?" \
    # Y( _' a/ e. b% [+ y$ ~其实我想说的是 真正数值计算部分和代码中其他不直接计算的overhead的比值这个事儿。2 t0 o6 l1 {* W3 y/ e' l. I7 F
      V" Y4 {' x/ @+ N2 v% W! q
    雷达兄构造测试用例的时候,屏蔽掉了所有计算的部分,使得剩下的都是overhead,这样run time比较的结果就显得好像不合理了。如果把计算加回去,计算部分的run time会dominate,结果就不那么离谱了。因为不好说,所以用指令数对比的方式试图直观地说明这一点。% I  G1 r) T7 B

    ! O8 l* X$ z% s( r3 F  R6 `2 X比如说,如果有计算,那么跑六千个循环相对于计算应该用不了多少时间。但是如果一边是什么都不做,另一边是六千个循环,那六千个循环比什么都不做慢几十倍了,就不是那么不合理了。( h$ S) o; E" L7 X- u
      c7 u, v( V4 t$ P
    当然也有可能像兄台说的,是优化参数的问题,但我觉得更多地是测试用例设计的不合理。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    12#
     楼主| 发表于 2022-9-25 04:47:43 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 04:49 编辑 5 N# m" Q( e4 }& B( {" T9 I
    沉宝 发表于 2022-9-25 01:27
    # h; d# c7 n5 [, ^! h你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子 ...
    0 p( `/ k3 c" o4 n$ y2 Q9 ^/ @9 F" c0 b

    ; K, B( A: b( P" E2 _& t: w$ h又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差一倍,我上面这个差的太多了。# S& G7 g3 P3 N( W& ~" `

    9 X3 k$ t& K( }( L+ ~% r) D1 e我已经完全懵了。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    13#
    发表于 2022-9-25 05:51:23 | 只看该作者
    雷达 发表于 2022-9-25 04:47
    * ]7 I) a- _; y又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...
    8 k3 A  h) a2 c& L
    时间差一倍的结果可以接受。7 i6 n" f+ |3 D! e9 Z5 T

    ) e7 N# h$ w2 C: D你还是用profile工具看看吧。现在大家都主观瞎猜。
    回复 支持 反对

    使用道具 举报

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

    [LV.Master]无

    14#
    发表于 2022-9-25 14:58:59 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 15:38 编辑 ! N8 I) k2 a+ }+ |! ]9 [
    雷达 发表于 2022-9-25 04:47! p/ q7 E2 N  ?/ y" o
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...
    * M+ X# b5 d1 \, x0 v: o9 y6 G% x7 v
    , ~# H% Q8 X2 H" z( h! x

    4 j* L/ n( i, v( G" `/ V7 S+ e3 ~; ?. f1 x( |
    能不能把这个也贴上来,看看和上一个有什么不同?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    15#
     楼主| 发表于 2022-9-26 01:30:03 | 只看该作者
    本帖最后由 雷达 于 2022-9-27 01:17 编辑
    2 F6 V$ y3 d0 f* p' z
    数值分析 发表于 2022-9-25 14:58% ]! M- h, r* f! a' C2 T
    能不能把这个也贴上来,看看和上一个有什么不同?
    $ I, @+ t/ b& \/ C! h) n" Y
    理了理思路,重新做了一个测试。
    ! d- G0 P" a3 i7 {6 P做了两个 vector 和 两个 float *, 都长 100000, R3 L2 l; \) ]. F+ [% E# I& D
    外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
    8 D& Y  _% r/ q4 G$ E% p+ ^5 z% X/ u: X- |. W
    内循环试了4种方法,1 w% |  Q7 n. ?
    1. 直接调用 vector inner_product 247s 1 ]9 ^6 p" C% r# N; h) [
    2. vector 循环点乘累加 237s2 a; E6 c0 k% ?1 E
    3. float * 循环点乘累加 204s
    * t1 y4 o: E+ S4. 空循环 100000 次 202s
    + B: L- {" m6 Q: w. L: N  G# W8 |1 C) p& M
    不做内循环 200s4 ^' z2 m) u# Y! y% i) X1 Z( [
    . P* @1 m* _% d+ l
    你昨天说的对,内循环本身占比是很小的,大头在其他处理。3 j0 T( n+ `" V4 y2 T" H
    另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
    , X! K' x2 {; B9 _4 G, x" Z3 T
    0 R$ j" ~  a3 X至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
    9 k. m( m  `5 ?5 l6 A, o
    7 \3 G* i" w' V6 E" v(为什么下面我贴的  b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成  jj 好了,原来 方括号里的 i 是斜体标志  LOL); y- p9 E: f( E% L

    / D, Z0 @5 w, B- {" t+ }4 K5 a$ Q
            std::vector < float > vec1(N);9 W; q! ~2 ^! U" D+ e  B
            std::vector < float > vec2(N);$ L- |7 E% D5 i) _9 T& s1 @
            float* b1 = new float[N];
    + c& s4 K$ }$ b# z. X! f, ?  B        float* b2 = new float[N];
    2 Q; k8 i. g/ o, m: l; x3 S. K
    % X/ d  d$ s$ A. r        for (int j = 0; j < 6000; j++)) P; ~" ^) h! b' @
            {# r7 R0 s" I* _7 s4 ]2 O! H
                    std::generate(vec1.begin(), vec1.end(), []() {
    3 \% V4 D" Q& I: S1 l3 L! Y3 v6 A0 Y                        return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
    $ r$ J. v+ {5 J+ J* B( G3 j8 K                        });
    ; c4 ]* B" A5 ^# d, x) {5 q) q9 ^- H( T. A* v4 E$ q7 x
                    std::generate(vec2.begin(), vec2.end(), []() {
    . Y! v- S3 i& r& P0 f, Y7 q                        return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;$ Y2 g' c" H9 \& j$ ~/ a: b
                            });
    ! N0 B9 |$ ^) d2 ^
    6 m5 e9 I. O+ R0 T% k                for (size_t jj = 0; jj < vec1.size(); jj++)
    5 t5 ?6 K! `% M0 q; P& J# Z                {7 B/ G# f" A+ g% s
                            b1[jj] = vec1[jj];, G. ?2 P3 n! N( b5 ~9 j7 T
                    }
    9 E: f7 U! k- w$ U5 O5 y
    ) q) n1 ?2 ?3 s, r2 U4 Z6 K0 A) \8 U                for (size_t jj = 0; jj < vec2.size(); jj++)
    : [/ z: {( J" H8 U* f/ ~                {
    * L, D& Y$ r1 `) x% ]                        b2[jj] = vec2[jj];
      z& R1 H! S7 q0 x9 ]) _                }  a% w+ w3 n5 U3 g+ i

    3 j9 r1 S2 U) x/ `                //Method - 1  N=100000 247s  
    ' b/ I9 R$ a3 |0 B* R0 w                //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
    : a& W6 V' Z- I3 ~4 n) I                                * s0 d/ m1 e3 u
                    //Method - 2  N=100000  237s" z" v) L9 @5 ]
                    /*
    4 |. |/ r1 G7 s8 \# H                for (int jj = 0; jj < N ; jj++)% \; N% z7 L. T9 z+ b
                    {
    # P: s& H2 ~9 t! j2 [, B0 n! h* g' F                        fresult += vec1[jj] * vec2[jj];* `% B& k/ D, i5 [7 A0 h1 F& k
                    }
    # ?$ `8 n7 x7 X" l% q                */) l& b8 X  o/ U* c9 B
                                    
      T* Z( R3 V# I1 M6 j0 S. ]: N8 r, n                //Method - 3  N=100000 204s4 G! `" A5 z9 j
                    /*0 {; V0 u5 z: H
                    for (int jj = 0; jj < N; jj++)5 P! A) N% b8 y4 f
                    {6 j  d% C9 j4 X  @0 @
                            fresult += b1[jj] * b2[jj];3 j, t( q. Y  P' {! c+ J
                    }4 c' A' |' T' I! M& T0 m- L
                    */+ O3 Z0 U; [  @) A' p

    5 T, Y' r3 p) y5 y4 m: q  m                //Method - 4   202s
    8 \1 H7 u0 z* L  o. I% I5 `9 L                /*% y% x+ l1 M4 H, a3 N
                    for (int jj = 0; jj < N; jj++)" w1 c% x0 W1 K+ z; q0 Y
                    {0 w" I4 I6 }- R0 y
                            
    8 U5 v2 W& n) H% R: A                }
    + b& U) t4 U) S" t5 d3 G9 T                */- L5 A1 o5 ~" Y) q0 f. o: b( v
                    //comment out all methods, N=100000  202s                # v. H5 \$ \3 J7 F* s. e
            }
    7 O+ y7 W2 D3 Z- H3 i$ [# m) l- {6 u$ \5 w: \' h
            delete []b1;
    : b+ V' v* h) E' q        delete []b2;
    1 R7 D% r1 N5 C" n* a) b, y
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    16#
    发表于 2022-9-27 00:15:38 | 只看该作者
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?/ R" V  Y+ U9 E5 X9 a& @: f
    $ r* D7 H3 y' Q- L9 a2 k! r+ ?
    你第二个试验里面的j在循环里面又重新定义了啊,你确定真的跑了6000次?
    6 c% V* A3 r. {2 v* B, H& Y/ L
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    17#
     楼主| 发表于 2022-9-27 01:16:03 | 只看该作者
    机器猫 发表于 2022-9-27 00:15
    4 [# G' G. B3 B瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?( Q9 d& e6 v( [
    8 n/ o5 m1 D+ I6 C/ u% j2 x
    你第二个试验里面的j在循环里面又重新定义 ...

    / g; X# V! J" z7 U0 a" V+ e5 a内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL4 u2 r/ n: @( r, M! _6 r2 T

    ! f6 i$ s7 V* ^( x9 {& L不和它较劲了,瞎耽误工夫,我已经转到 ubuntu, 也准备顺便试试 avx2 向量化。
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    18#
    发表于 2022-9-27 02:06:58 | 只看该作者
    雷达 发表于 2022-9-27 01:16$ c- y( Y$ N( C- }; r& m5 g
    内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL
    + ~$ z- q% s) Q' W' S" ?5 a" P& m- q  D; H" q* T5 q
    不和它 ...
    0 W: f* O1 ]) }) J! F* S( F

    . _8 a' {/ A. B6 j不过可以试试我说的register变量。前一个试验j是混在一堆其它变量里一起定义的,很有可能是在stack上,这样内存读写会更多,要是再碰上每次都需要加载cache就更慢了。9 r3 o2 l0 o" t# S
    后面一个是在循环那里定义的,说不定编译器就把它优化成register变量了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

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

    使用道具 举报

    该用户从未签到

    20#
    发表于 2022-9-27 20:29:50 | 只看该作者
    雷达 发表于 2022-9-24 23:544 P" {1 F- n7 e, O- J% M
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    2 F; `) p; v. M; d{, }4 \5 E& Z/ G& |: `
            comp temp, xtimesy;

    ) V' p. I; J( @& O这个code里面如果Openmp没有被注释掉的话,那么temp那个变量应该是定义在循环里面,否则线程之间会存在争夺写入那个temp的风险。" C3 p- R0 Z1 J2 m
    内层for循环如果没有内部操作的话,编译时应该被优化掉了,和你完全注册掉整个循环是一回事。可能你的编译设置没有打开优化?
    % I) a3 f! O/ o$ ^* nVS社区版没有问题,我工作用的就是社区版,设置正常的话不会比商业版差。以前游说头头用Intel Compiler,他说不想花钱,而且差不了多少,就一直用到现在。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2026-1-3 01:26 , Processed in 0.040639 second(s), 19 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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