设为首页收藏本站

爱吱声

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

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2022-9-24 22:54:26 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
    C++ 比 Octave 慢好多,怎么破?' C. \; g8 A9 J% e5 ]9 \& X/ @4 D

    - l+ b# c3 i0 d" J8 K# B7 u1 l自相关两层循环,内层循环涉及浮点数计算,试验了一下把内层循环内部全都 comment out 只留个壳子,  但空的内层循环本身就把速度拉下来了,看来问题并不在浮点计算。
    # c, ]7 }, B! T# H# V0 F. @! L5 q6 o6 a; h) r4 T8 ]" [
    速度优化问题真的很有意思啊。) D2 E' H4 {% u1 _! N
    7 F9 e4 g+ a9 t& \/ m- l% t% _
    欢迎大家继续讨论

    评分

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

    查看全部评分

  • TA的每日心情
    开心
    3 天前
  • 签到天数: 1949 天

    [LV.Master]无

    沙发
    发表于 2022-9-24 23:04:16 | 只看该作者
    拉下来?拉多少?
    : }$ D6 B! y9 J9 u把代码贴上来看看?. @- v. ?2 X- y7 S8 X7 p
    ' E' A; b7 i" r; j
    难道分支预测不准破坏流水线执行?不该啊。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    板凳
    发表于 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 编辑 $ j/ k) X4 ?; K9 k9 U3 u! t/ C
    数值分析 发表于 2022-9-24 23:04
    2 X* ^1 g# C, P& U! G拉下来?拉多少?' B  I+ Z* w; M9 w
    把代码贴上来看看?

    1 [4 r1 b# K- ~! X. K5 l5 a0 ^! s7 D9 g/ U; i
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)8 O6 s! P( {* E
    {. U3 U- P0 y& ^) U& h  w% C: E2 C5 @
            comp temp, xtimesy;
    1 I! V8 ]. P) N        xtimesy.re = 0;, r2 W& c# n5 A/ p% J% _3 x6 c
            xtimesy.im = 0;
    : p7 p; H! f6 E1 S6 [; ~        int j0 = lenB - 1;1 P" d5 [7 T* B* Z" \: J0 [) k
            int    i, j, i1, reali;
    % @! r( U2 d5 V  s) [% g        if (lenA % 2 == 1)
    ) ]4 i6 B6 }6 K! I- N, _                reali = lenA + 1;
    6 D8 E& f+ T5 w, U$ c& G: l% ^        else' |- N: e! u* V' {
                    reali = lenA;1 _& u6 w1 a3 b3 p7 G$ u
            reali /= 2;: k/ P, z- r9 ~6 Q( V

    ! n% s6 A% J& q& p+ w9 C% w8 D% [        int nconv = reali + lenB;4 I9 a/ }: r9 ?9 j/ l9 \- A) b
            //#pragma omp parallel for$ `2 \6 g$ d; l# ]- V& A
            for (i = reali; i < nconv; i++): ^2 \" Z1 `: p9 U7 a) ^
            {% Z9 P& n  z6 o6 x; f$ k
                    temp.re = 0;
    6 P/ x# g2 }4 {                temp.im = 0;
    ) Q: m* Y4 ?/ D; ?8 C" I                i1 = i;& @3 {) H9 F/ |% u6 Y5 E8 ~
                    for (j = j0; j >= 0; j--)$ b1 E( t! [# m+ r) N
                    {
    5 _7 L5 d' F8 p9 ^8 d                        /* floating date operation */, l) V' k& q; _3 A
                    }

    ; n1 v& X: e# B5 U' ?/ r5 A* _        }3 Z/ l, U3 \" m7 z6 h% P  R7 }
    }: p+ u4 I" q3 [
    0 E+ Y  B' b1 r
    xcorr函数代码如上,comp是复数struct, 做过长度为11、19两个矢量的测试,和octave结果完全一样
    $ H) ^8 S4 J' r9 T- C5 Y/ i# q( U
    红色部分是内循环,现在其内部操作都comment out 了, j0大概是 6000。
    : v' J& ~* C8 u9 ?现在call xcorr 100次,耗时78s.0 T- g+ ]; |& {/ ], R

    5 S- B* r) d1 I; c; Q+ X1 X) j, G如果把红色部分内循环本身完全comment out, call xcorr 1000次,耗时 <1s. 7 ^4 r; N7 G1 l" l- w

    ) }9 P  l; G  g7 }. u! h, T
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    6#
     楼主| 发表于 2022-9-25 00:17:17 | 只看该作者
    风雨无阻 发表于 2022-9-24 23:33
    9 D  q% ^! A: d7 H% o# k2 Q/ fMaybe Debug mode?
    " l) ~/ X! B7 ~3 C) Z

    ' |( ^- }, H2 m不应该,看我上面的回复。+ Q. j# H& R, v7 i5 v
    1 j8 a9 l4 Q1 q6 b& o0 T
    我更怀疑是 VS 社区版的问题
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    3 天前
  • 签到天数: 1949 天

    [LV.Master]无

    7#
    发表于 2022-9-25 00:20:10 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 00:24 编辑
    4 g( {% w6 _- z7 @. X
    雷达 发表于 2022-9-24 23:543 n3 G5 y; S4 p6 J- t
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    ' a( c) {- K) F! j) Q5 B{
    5 e  c! V: U; g/ A        comp temp, xtimesy;

    . m: S4 s' N2 F6 z" ~' l7 ?* ?' |- A$ F
    这个不是这么比的吧。。。
    8 \* J" G* t/ _$ L, @# o7 i, g4 W& ?! A: x2 E- ?
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    9 a: `7 Z0 z6 y% a  Q
    7 e& {- b8 d0 i* j# m) E而加上内循环,光jmp和dec指令就至少多执行了6000个,慢个几十倍不是正常的么?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    8#
     楼主| 发表于 2022-9-25 00:46:56 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 01:09 编辑
    ) i$ _8 y3 f/ |+ G: n  H4 q& H
    数值分析 发表于 2022-9-25 00:203 h0 V4 H. X# Q+ S2 {$ S
    这个不是这么比的吧。。。
    5 b$ M3 o/ |7 C! M; [( E: C) D+ F$ k2 o/ [
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    0 c. v& ]+ h: C+ `
    ! a7 b! L1 {$ j1 O: _& i8 F/ F9 o
    有道理。( T5 C) r7 e! C% l: ~$ ]. u3 U
    所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,记得 numeric 库里有算向量内积的,我回头试试。5 h; t8 Q3 ?, F: w

    % b# ~; k6 T* Z# x- p5 |5 a我先尝试尽量用标准库,一个小程序,不想搞得太复杂。多谢了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    9#
    发表于 2022-9-25 01:27:53 | 只看该作者
    雷达 发表于 2022-9-25 00:46  X/ |% I0 h7 ~
    有道理。5 }: u" A4 ]& g& {6 J  T
    所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,这大 ...

    4 Q* C& X) T4 C" b) S: Z你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子,把循环本身翻译成机器指令loop或dec/jnz,两者速度上会差很多
    7 a; l- z. ~; x% |  sWhy is the loop instruction slow? Couldn't Intel have implemented it efficiently?
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    10#
    发表于 2022-9-25 01:48:51 | 只看该作者
    数值分析 发表于 2022-9-25 00:20) Q% x; F4 ~+ L; D8 m, c- H; X( {2 p
    这个不是这么比的吧。。。& r6 R2 q: E7 R  m+ c" u

    * S3 I! r$ V+ z! X. N您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    而加上内循环,光jmp和dec指令就至少多执行了6000个

    - ]' @, Q, A. W/ |; r' D
    9 V$ P+ K9 n. ?7 q* q! t5 I现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果循环这样跑,花不了多少时间。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    3 天前
  • 签到天数: 1949 天

    [LV.Master]无

    11#
    发表于 2022-9-25 02:06:44 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 02:16 编辑
    # x3 \5 `4 g8 F+ r4 P4 X0 Z5 V
    沉宝 发表于 2022-9-25 01:489 n9 B" ]2 N+ d
    现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果 ...
    7 v3 d8 t: s$ E! }$ }: N3 v, y2 q

    ; {: n/ L9 {5 S' ~是的,兄台说的对。' N) v+ D: R2 H: `( Y3 G$ u6 P

    & J' f2 [* M1 A其实我想说的是 真正数值计算部分和代码中其他不直接计算的overhead的比值这个事儿。
    5 w: q$ p, E  M7 s% K2 }
    9 q' y3 G4 g* K! H雷达兄构造测试用例的时候,屏蔽掉了所有计算的部分,使得剩下的都是overhead,这样run time比较的结果就显得好像不合理了。如果把计算加回去,计算部分的run time会dominate,结果就不那么离谱了。因为不好说,所以用指令数对比的方式试图直观地说明这一点。! p- s& A3 k$ X: {7 _

    / }" N( E4 o% h1 W( `比如说,如果有计算,那么跑六千个循环相对于计算应该用不了多少时间。但是如果一边是什么都不做,另一边是六千个循环,那六千个循环比什么都不做慢几十倍了,就不是那么不合理了。
    & X: D) G9 R) T# H) M7 I( L/ x: {, n; A( L& Z4 c+ c8 B: N- F
    当然也有可能像兄台说的,是优化参数的问题,但我觉得更多地是测试用例设计的不合理。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    12#
     楼主| 发表于 2022-9-25 04:47:43 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 04:49 编辑
    8 Z$ x3 O4 C5 z7 U2 v" q6 f4 Y
    沉宝 发表于 2022-9-25 01:277 F8 }# O# E  t: b$ T2 o6 |1 ~( c
    你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子 ...

    1 h* K% H$ g# e" a/ W) E" c
    8 M- c# s) I1 S% t又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差一倍,我上面这个差的太多了。
    6 I) t- I1 ~8 ]1 w+ K
    1 m2 g, j$ J# l6 C" c) z! K我已经完全懵了。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    13#
    发表于 2022-9-25 05:51:23 | 只看该作者
    雷达 发表于 2022-9-25 04:47# I' C( ~$ D) U) T' b2 Z% K8 J
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...
    ) W* I( F7 U' N/ |0 d! M2 K
    时间差一倍的结果可以接受。
    . W( k! T5 o. T( G4 s! P
    2 \8 C( ~) l- m' L+ L你还是用profile工具看看吧。现在大家都主观瞎猜。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    3 天前
  • 签到天数: 1949 天

    [LV.Master]无

    14#
    发表于 2022-9-25 14:58:59 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 15:38 编辑
    5 ~: C' r( j) J& `! ^
    雷达 发表于 2022-9-25 04:47
    ; z. M+ p# J7 @1 h又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...
    / {! X5 w) d9 H; Z# E

    - _1 {) k0 k! H! k1 o6 [
      U3 E: S, R) D% D, V" u
    1 o! _+ q% _' L( @能不能把这个也贴上来,看看和上一个有什么不同?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    15#
     楼主| 发表于 2022-9-26 01:30:03 | 只看该作者
    本帖最后由 雷达 于 2022-9-27 01:17 编辑 ) J+ Z: Q' {7 Y
    数值分析 发表于 2022-9-25 14:58
    1 E; c* z8 M$ E. q: [/ ^能不能把这个也贴上来,看看和上一个有什么不同?
    + ^& o3 k4 r9 P- H; v& v
    理了理思路,重新做了一个测试。
    9 I& L3 \% z7 y# e, X9 ?% R( j& g  A9 I做了两个 vector 和 两个 float *, 都长 100000
    7 s( C6 i; `$ @& s/ t  Z外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.9 ]5 z2 b5 z3 `
    # H1 q9 o% O' u) J, b4 Y, n
    内循环试了4种方法,
    8 l& ]- r1 j* t* P. V' o1. 直接调用 vector inner_product 247s
    8 ]6 _, K( |8 r# W9 V6 U2. vector 循环点乘累加 237s' Y2 M4 M/ m$ i' U
    3. float * 循环点乘累加 204s# r5 \+ [, [( g9 b" Z
    4. 空循环 100000 次 202s
    # \5 B# ^4 n1 A- |6 b" M+ e8 `
    # p) f2 f# u. d/ n7 U% |" f  H9 `不做内循环 200s
    4 ]5 s  j1 H; V& X7 M8 C7 @3 X. v/ h. L4 m& u
    你昨天说的对,内循环本身占比是很小的,大头在其他处理。
    $ H4 T" x* g( }另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
    & _. m1 t$ f; M( L, }6 ?2 m: p9 ]
    ( S; }* F7 C  s" D, {- L2 C* X至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
    8 r+ O$ a. u/ H3 P+ r9 b9 t( y* ~1 C7 u5 [- m2 ]( z! ?
    (为什么下面我贴的  b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成  jj 好了,原来 方括号里的 i 是斜体标志  LOL)& p' q1 ]- g7 g
    , @3 n8 v! ^  l- ^% J: L
            std::vector < float > vec1(N);8 h0 @! Q( H$ \8 Q5 F" G" I
            std::vector < float > vec2(N);/ P: D7 k: N3 L4 Z9 a' K
            float* b1 = new float[N];
    0 C0 _' r* \+ \: X/ O- K        float* b2 = new float[N];2 Q/ s- M3 H  `  v6 u( i
    6 p9 Z8 q6 |$ i# q/ O! j
            for (int j = 0; j < 6000; j++)
    7 x! p$ D) q+ A8 l9 r& }2 l        {7 {% m7 g& C" H
                    std::generate(vec1.begin(), vec1.end(), []() {
    & z( A: Z6 i/ D! q                        return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;7 v: p3 S4 y9 M
                            });
    ) d$ x! d* ^7 X. C( ]3 @+ s; P6 A) {1 v9 t, X+ w3 f1 u0 y: A
                    std::generate(vec2.begin(), vec2.end(), []() {, T2 q8 A% e$ F! [
                            return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;! R4 i- |$ D2 l: o; e. v7 E" D% R3 e
                            });
    ; C* k$ D7 Y0 D2 c* M) L/ _8 H- m7 u) ?
                    for (size_t jj = 0; jj < vec1.size(); jj++); j4 ^# i; S! N
                    {
    7 P6 `$ z7 ]" y                        b1[jj] = vec1[jj];
    ' j) [! O) d' c( _7 {- ^                }  P2 S. N+ e. G
    4 Q% f! j+ O5 T8 y
                    for (size_t jj = 0; jj < vec2.size(); jj++)
    * c8 h% p+ v1 c& `                {
    2 ?. N; B7 C" P                        b2[jj] = vec2[jj];( L/ ?# }  m" }. t. v+ X, A
                    }$ V1 I  M3 X: P6 K2 V2 S0 Z
    : U: H$ a8 [2 {9 s5 ]" F
                    //Method - 1  N=100000 247s  
    7 [' [. S; @1 O1 |( E1 Z) D6 M                //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);4 k2 Y7 y7 b6 M' e" A! _: D
                                    
    " z# V& {" s. e) r" N: v+ [* R( q                //Method - 2  N=100000  237s
    5 s! n% G7 V2 G. R                /*
    2 ^+ f. t$ Y3 z: J' s6 |7 j; j                for (int jj = 0; jj < N ; jj++)+ f6 ^* g+ o8 n' u, a
                    {
    , P, Y" v/ |4 S* m- S* q' |3 ]                        fresult += vec1[jj] * vec2[jj];
    & Z& W2 ]# S5 d' q7 y                }
    . G2 |  z! C0 S: f" `# T5 s                */
    2 b$ f) S3 _) G/ D7 X                                0 `7 x$ @( D: Z5 R/ e
                    //Method - 3  N=100000 204s: U( B- C- \6 [* {' N3 v  I" m
                    /*6 l* V& V' ~: }
                    for (int jj = 0; jj < N; jj++)
    $ H( P: e+ s2 I( s9 Q5 f                {  k+ Z- z8 b% I! p" I, @
                            fresult += b1[jj] * b2[jj];# }2 q' u2 ]' V5 c" v9 D! `9 L
                    }# P+ E" V" B( i0 K% ?
                    */8 j: A5 @0 {/ T  F4 {6 F( w

    0 k) j6 q2 R  v) n                //Method - 4   202s/ J$ A. [% [# K
                    /*: w" f. e& i" C! r2 P2 T
                    for (int jj = 0; jj < N; jj++)+ s; \: @- \: }# E2 M( j- H. D
                    {
      G  l  J( L  S# ^9 V' a                        
    ) c6 n) T8 q( \( q                }: q& l6 A2 i' X! k  b
                    */- x) w3 m$ A. x4 ]* T
                    //comment out all methods, N=100000  202s               
    9 g; [- Z( P# {* y        }! I8 j& C. U; j) E- v& y

    + {" Q1 b3 R" J/ t$ N* d$ S        delete []b1;
    8 ^: m& i" z. }        delete []b2;
    1 u+ q# h% e  k0 {- k" O
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    16#
    发表于 2022-9-27 00:15:38 | 只看该作者
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?
    2 \2 ~0 F2 v& }  g: Z& s* M( o" ^/ d( [# d+ M
    你第二个试验里面的j在循环里面又重新定义了啊,你确定真的跑了6000次?
    " R. \7 B6 q+ A/ N( w+ y
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    17#
     楼主| 发表于 2022-9-27 01:16:03 | 只看该作者
    机器猫 发表于 2022-9-27 00:15
    / |+ m, O& }# F5 Q* V( e8 m# m3 X瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?
    + S. h; f, t3 \# X. o
    : G8 M0 i/ X! L" \- x% ~; X1 y" Z你第二个试验里面的j在循环里面又重新定义 ...

      t4 J4 f$ {9 n( x) W& r内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL( [5 r8 s; Z6 @; B9 `% `/ z
    1 |% p" g& z7 [' Z* w" W
    不和它较劲了,瞎耽误工夫,我已经转到 ubuntu, 也准备顺便试试 avx2 向量化。
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    18#
    发表于 2022-9-27 02:06:58 | 只看该作者
    雷达 发表于 2022-9-27 01:161 V' h" [/ |0 l4 \- f; i5 q3 n
    内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL6 q3 d/ \9 [* ~) I4 f  s* [9 R( f+ f# x

    ) G5 F6 r% @- c. g4 ]9 L% |不和它 ...
    " a+ o0 m0 u, q. w2 l# B
    & H6 n/ z  w1 h7 a( w; b
    不过可以试试我说的register变量。前一个试验j是混在一堆其它变量里一起定义的,很有可能是在stack上,这样内存读写会更多,要是再碰上每次都需要加载cache就更慢了。9 s: l) N/ o' [' q/ A
    后面一个是在循环那里定义的,说不定编译器就把它优化成register变量了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

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

    使用道具 举报

    该用户从未签到

    20#
    发表于 2022-9-27 20:29:50 | 只看该作者
    雷达 发表于 2022-9-24 23:54
    & f: N  H7 r( u% x5 Vvoid xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB). Y& |3 V0 _- f- I* ?$ L
    {
    $ z( N: i* H4 q7 [3 T        comp temp, xtimesy;
    * ~/ f1 i" u  ?/ y. M, N
    这个code里面如果Openmp没有被注释掉的话,那么temp那个变量应该是定义在循环里面,否则线程之间会存在争夺写入那个temp的风险。! P9 j9 x. H9 H) L$ i( F/ c, p
    内层for循环如果没有内部操作的话,编译时应该被优化掉了,和你完全注册掉整个循环是一回事。可能你的编译设置没有打开优化?
    - P" D4 U- n2 c" x0 i' r; C! w/ nVS社区版没有问题,我工作用的就是社区版,设置正常的话不会比商业版差。以前游说头头用Intel Compiler,他说不想花钱,而且差不了多少,就一直用到现在。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2025-10-19 11:23 , Processed in 0.060327 second(s), 22 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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